在用户在类别下拉列表中选择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)
答案 0 :(得分:3)
在第二个选项卡的observe
中,使用reactiveValuesToList(input)[[paste0(x,"_categorical")]]
。这意味着此观察对任何input
元素中的任何更改都是反应性的,因此,如果您更改“输入”输入,也是如此。您可以只使用input[[paste0(x,"_categorical")]]
来摆脱这种行为。
请注意,使用lapply
实现动态UI会导致在选择其他变量时删除并重新渲染已经存在的输入选择。也许您可以看看insertUI
/ removeUI
来获得更好的用户界面。