2016-10-31 59 views
0

EDITE: 我增加了一個例子是一樣的我的問題。我想將checkboxGroupInput更新爲dataset更改。並且還希望使用checkboxGroupInput選項中的選中列來呈現表格。動態渲染UI的輸入和輸出r光澤

服務器

shinyServer(function(input, output, session) { 

    dataset_list <- list("rock" = rock,  
          "pressure" = pressure, 
          "cars" = cars 
         ) 

    observeEvent(input$n_select_input, { 

     selected_dataset <- reactive({ 
           selected_list <- list() 
           for(i in 1:input$n_select_input){ 
             selected_list[[i]] <- dataset_list[[i]] 
            } 
           names(selected_list) <- names(dataset_list)[1:input$n_select_input] 
           selected_list 
           }) 


     colname_indata_list <- reactive({ 

           colname.indata.list <- list() 
           for(set in names(selected_dataset())){ 
            colname.indata.list[[set]] <- colnames(selected_dataset()[[set]]) 
            } 
           colname.indata.list 
           }) 


     choice_cand <- reactive({ names(selected_dataset()) }) 


    updateSelectInput(session, 
         "dataset", 
         choices = as.character(choice_cand()) 
        ) 

    choices_cand <- reactive({ colname_indata_list()[[input$dataset]] }) 

    updateCheckboxGroupInput(session, 
           "column", 
           choices = as.character(choices_cand()) 
          ) 

    }) 


# observeEvent(input$dataset, { 
# 
# choices_cand <- reactive({ colname_indata_list()[[input$dataset]] }) 
# updateCheckboxGroupInput(session, "column", 
#        choices = as.character(choices_cand())) 
# 
# }) 

datasetInput <- reactive({ 
    switch(input$dataset, 
     "rock" = rock, 
     "pressure" = pressure, 
     "cars" = cars) 
    }) 

output$table <- renderTable({ 
    datasetInput() 
    }) 


}) 

我試着在上面的##,它不工作的代碼。

UI

shinyUI( 
    fluidPage(titlePanel('Downloading Data'), 
      sidebarLayout(
       sidebarPanel(numericInput("n_select_input", "n select inpur", 1, 
              min=1, max=3), 
           selectInput("dataset", "Choose a dataset:", 
             choices = ""), 
          checkboxGroupInput("column", "select column", 
               choices = "") 
          ), 
       mainPanel(
       tableOutput('table') 
       ) 
       ) 
      ) 
) 

第一寫:

我簡化下面的代碼。我想使用更新的選擇輸入作爲updatedCheckboxGroupInput選項的輸出。但更新的選擇輸入input$select_group爲空。我嘗試了各種解決方案..但無法解決它。 如果你只是運行這段代碼向右走,這是行不通的..

fund_group <- reactive({ # this is the list of fund group including fund name 
         # for example, 
         "domestic" = c("a","b", "c"), 
         "global" = c("aa", "bb", "cc") 
         # list name and fund name in the list are changable 
         }) 

我想更新selectInput選擇,因爲names(fund_group)變化。 所以我用下面的代碼,

observe({ 
     group_name <- reactive({ names(fund_group()) }) 
     updateSelectInput(session, 
          "select_group", 
          choices = group_name()) 

     fund_list <- reactive({ fund_group()[[input$select_group]] }) 
     updateCheckboxGroupInput(session, 
            "fund_in_group", 
            choices = fund_list(), 
            selected = fund_list()) 
     }) 

對於UI,

narvarPage("narvarTitle", 
tabPanel("tab panel", 

fluidRow(column(3, wellPanel(textOutput("fixed_anal_date"), 
      br(), 
      br(), 
      selectInput("select_group", 
         label = "Select group", 
         choices = ""), 
      br(), 
      checkboxGroupInput("fund_in_group", 
           label = "Select funds :", 
           choices = ""), 
      br() 
)) 
)) 

感謝您閱讀的亂碼...

+0

你能更好地解釋你的問題併發佈一個最小可重現的例子嗎?這一個缺少功能。 –

+0

@BárbaraBorges我編輯了我的代碼,謝謝你的回覆!希望它能更好地識別 – yeyoung

+0

這段代碼似乎仍然有一些缺失的功能 – SBista

回答

0

我已編輯代碼的工作了。你應該把兩個輸入放在兩個不同的觀察中。

這是服務器。 R:

server <- function(input, output, session){ 

    fund_group <- reactive({ # this is the list of fund group including fund name 
    # for example, 
    list("domestic" = c("a","b", "c"), "global" = c("aa", "bb", "cc")) 
    # list name and fund name in the list are changable 
    }) 

    observe({ 
    group_name <- reactive({ names(fund_group()) }) 
    updateSelectInput(session, 
         "select_group", 
         choices = group_name()) 

    }) 

    observe({ 
    fund_list <- reactive({ fund_group()[[input$select_group]] }) 
    updateCheckboxGroupInput(session, 
           "fund_in_group", 
           choices = fund_list(), 
           selected = fund_list()) 
    }) 

} 

這裏是ui.R:

ui <- navbarPage("narvarTitle", 
      tabPanel("tab panel", 

         fluidRow(column(3, wellPanel(textOutput("fixed_anual_date"), 
                 br(), 
                 br(), 
                 selectInput("select_group", 
                    label = "Select group", 
                    choices = ""), 
                 br(), 
                 checkboxGroupInput("fund_in_group", 
                      label = "Select funds :", 
                      choices = ""), 
                 br() 
        )) 
        )) 

) 

[編輯]:

按照您最新的更新我已經修改了服務器代碼,以便checkboxGrouptInput作爲更新dataset更改,並且該表格也針對已檢查的列進行呈現。

shinyServer(function(input, output, session) { 

    dataset_list <- list("rock" = rock,  
         "pressure" = pressure, 
         "cars" = cars 
) 

    observeEvent(input$n_select_input, { 

    selected_dataset <- reactive({ 
     selected_list <- list() 
     for(i in 1:input$n_select_input){ 
     selected_list[[i]] <- dataset_list[[i]] 
     } 

     names(selected_list) <- names(dataset_list)[1:input$n_select_input] 
     selected_list 
    }) 


    colname_indata_list <- reactive({ 

     colname.indata.list <- list() 
     for(set in names(selected_dataset())){ 
     colname.indata.list[[set]] <- colnames(selected_dataset()[[set]]) 
     } 

     colname.indata.list 
    }) 


    choice_cand <- reactive({ 
     names(selected_dataset()) }) 

    updateSelectInput(session, 
         "dataset", 
         choices = as.character(choice_cand()) 
    ) 

    ######################################Start: Modified############################# 

    observe({ 

     input$dataset ##Added so that this observe is called when the input$dataset changes 
     choices_cand <- reactive({ 

     colname_indata_list()[[input$dataset]] }) 

     updateCheckboxGroupInput(session, 
           "column", 
           choices = as.character(choices_cand()) , 
           selected = as.character(choices_cand()) 
    ) 

    }) 

    }) 

    ######################################End: Modified############################# 


    datasetInput <- reactive({ 
    switch(input$dataset, 
      "rock" = rock, 
      "pressure" = pressure, 
      "cars" = cars) 
    }) 

    output$table <- renderTable({ 
    datasetInput()[,input$column]##only selected columns are displayed 
    }) 


}) 

希望這會有所幫助!

+0

謝謝你的回答。我已經嘗試了這個..但沒有工作:( – yeyoung

+0

@김예영它似乎爲我工作!這是一個工作[演示](https://sbista.shinyapps.io/Demo-SO40341423/)。 – SBista

+0

即使所選擇的組選擇是反應值,它是否工作? – yeyoung