闪亮:updateSelectInput()选择了带有observe()的参数

时间:2020-08-27 20:33:23

标签: r shiny

在用户在类别下拉列表中选择observe()之后,我正在使用selectInput来更改TRUE/FALSE的值。在程序的第一个标签中,如果将 Categorical 设置为TRUE,则 Impute 会更新为mode,否则更新为mean。然后,我可以根据需要更改 Impute 值,而无需恢复为选择TRUE/FALSE时出现的值。

在第二个标签中,我有多个selectInput列表,其界面与第一个标签相似;系统会为选择协变量中选择的每个值创建界面。在本节中,我还使用observe()根据第一个标签的逻辑更新每个选定的协变量的 Impute 下拉列表(即,如果选择了TRUE,则 Impute 已更新为mode,否则更新为mean)。但是, Impute 中的值似乎被锁定,因为我无法像在第一个选项卡中那样在值之间进行切换。

我不知道如何解决此问题,我想知道那里是否有人遇到过类似的问题并能够解决此问题。任何建议或帮助将不胜感激。

我的应用代码可以在下面看到,并且可以在一个文件中运行。

library(shiny)
library(shinyjs)

ui <- shinyUI(fluidPage(
  shinyjs::useShinyjs(),
  navbarPage("Test",id="navbarPage",
             tabPanel("First tab", id = "first_tab",
                      sidebarLayout(
                        sidebarPanel(
                          selectInput('covariate.L.categorical', 'Categorical', c("",TRUE,FALSE)),
                          selectInput('covariate.L.impute', "Impute", c("","default","mean","mode","median"))
                        ),
                        mainPanel()
                      )
             ),
             tabPanel("Second tab", id = "second_tab",
                      sidebarLayout(
                        sidebarPanel(
                          selectInput('covariates', 'Select covariates', choices = c("age","sex","race","bmi"), multiple=TRUE, selectize=TRUE), 
                          tags$hr(),
                          uiOutput("covariateop")
                        ),
                        mainPanel()
                      )
             ))
))

server <- shinyServer(function(input, output, session) {
  
  rv <- reactiveValues(cov.selected = NULL)
  
  observe({
    updateSelectInput(session, "covariate.L.impute", selected = ifelse(input$covariate.L.categorical,"mode","mean"))
  })
  
  output$covariateop <- renderUI({  
    lapply(input$covariates, function(x){
      
      tags$div(id = paste0("extra_criteria_for_", x),
               h4(x),
               selectInput(paste0(x,"_categorical"), "Categorical",
                           choices = c("",TRUE,FALSE)),
               selectInput(paste0(x,"_impute"), "Impute",
                           choices = c("","default","mean","mode","median")),
               textInput(paste0(x,"_impute_default_level"), "Impute default level"),
               tags$hr()
      )
    })
  })
  observe({
    lapply(input$covariates, function(x){
      updateSelectInput(session, paste0(x,"_impute"), selected = ifelse(as.logical(reactiveValuesToList(input)[[paste0(x,"_categorical")]])==TRUE,"mode","mean"))
    })
  })
})

# Run the application
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:3)

在第二个选项卡的observe中,使用reactiveValuesToList(input)[[paste0(x,"_categorical")]]。这意味着此观察对任何input元素中的任何更改都是反应性的,因此,如果您更改“输入”输入,也是如此。您可以只使用input[[paste0(x,"_categorical")]]来摆脱这种行为。

请注意,使用lapply实现动态UI会导致在选择其他变量时删除并重新渲染已经存在的输入选择。也许您可以看看insertUI / removeUI来获得更好的用户界面。