2016-02-07 57 views
0

我試圖在Shiny中想出一個應用程序,該應用程序接收名爲「利益相關方數量」的初始輸入,並且根據該數量,我想它會更改navbarPage()navlistPanel()結構中的選項卡數量。如何在Shiny中更改動態UI中的輸入數

當前的代碼我有複製一個類似的序列多次固定的利益相關者我設置的最大數量,留下我,不斷地重複一個巨大的10.000行代碼的命令:

tabPanel("Stakeholder #3", 
fluidRow(
column(2, textInput(inputId = "sh.name.3", label = "Stakeholder's name")), 
column(1), 
column(4, textInput(inputId = "sh.3.option.1", label = "Option #1")), 
column(1), 
column(4, textInput(inputId = "sh.3.option.2", label = "Option #2")) 
), 
fluidRow(
column(3), 
column(4, textInput(inputId = "sh.3.option.3", label = "Option #3")), 
column(1), 
column(4, textInput(inputId = "sh.3.option.4", label = "Option #4")) 
), 

我試圖找到一個選項,允許我同時創建一個更緊湊的代碼,這爲我提供了一種製作動態UI的方法,這意味着需要找到一種能夠動態管理變量的方法。

儘管R自然允許以流暢的方式管理變量,但我還沒有成功使用Shiny中的列表,向量或數據框架等結構。

我查了好幾天,但我沒能找到比這更復雜(這與變量重置本身有問題):http://shiny.rstudio.com/gallery/dynamic-ui.html

是否有任何解決方案來執行像我是什麼尋找?

謝謝您的高級。

+0

我假設你知道'renderUI'並且有一些使用它的經驗,並且你的主要問題是創建一個動態數字**的選項卡**。有很多關於如何創建動態數量輸入的示例,使用renderUI很容易,所以我會繼續假設創建制表符是困難的部分,因爲沒有太多示例。看看[這個問題+答案](http://stackoverflow.com/questions/19470426/r-shiny-add-tabpanel-to-tabsetpanel-dynamicaly-with-the-use-of-renderui)如何做到這一點,希望它有幫助 –

回答

2

使用lapply創建一組動態面板相當容易。假設你給利益相關者的數量是n,你的代碼將是:

n = 10 

app <- shinyApp(
    ui = shinyUI(fluidPage(

    uiOutput("tabsets") 

)), 

    server = function(input, output, session){ 

    output$tabsets <- renderUI({ 

     Panels <- lapply(1:n, function(number){ 
     tabPanel(paste0("Stakeholder #", number), 
      fluidRow(
      column(2, textInput(inputId = paste0("sh.name.", number), label = "Stakeholder's name")), 
      column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.1"), label = "Option #1")), 
      column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.2"), label = "Option #2")) 
      ), 
      fluidRow(
      column(4, offset = 3, textInput(inputId = paste0("sh.", number, ".option.3"), label = "Option #3")), 
      column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.4"), label = "Option #4")) 
      ) 
     ) 
     }) 

     do.call(tabsetPanel,Panels) 
    }) 
    } 
) 

runApp(app) 

我也改變了你的空列被包含在非空列offset屬性。

+0

這真的很酷。你能證明你如何訪問個人用戶的輸入嗎?例如,如果您希望打印一個表X_Table,該表是子集,只包含與在利益相關方1的選項卡中輸入的文本相匹配的行;可以說你的服務器函數包含以下代碼: 輸出$ my_table = renderTable({small_table = X_Table [X_Table $ Stakeholder1 == inputId,]; small_table}) – Slavatron

+0

我傾向於通過輸入[ ]]。例如輸入[[c(「stakeholder」,n)]],其中n是您生成的某個數字。這不是你要求的,是嗎? –

相關問題