我找到了几个大致相似的主题,但无法弄清楚如何解决我的问题,所以请寻求帮助:
我有两个selectInput
,其中第二个应该取决于第一个。标签和值(我需要绘制图形)来自data.frame。如何根据第二个selectInput中的选择来限制选项以及第二个selectInput中的值?
我尝试使用observeEvent
,但有一些缺失。这是一个最小的示例:
library(shiny)
method1 <- c("A","A","B","B","C","C")
value1 <- c(1,1,2,2,3,3)
method2 <- c("X","Y","X","Y","X","Y")
value2 <- c(1,2,3,4,5,6)
df <- data.frame(method1, value1, method2, value2)
val1 <- setNames(df$value1, df$method1)
ui <- fluidPage(
sidebarPanel(
selectInput("m1",
"Method1",
choices = val1,
selected = "A"),
selectInput("m2",
"Method2",
choices = NULL)))
server <- function(input, output, session) {
observeEvent(input$m1,{
updateSelectInput(session,'m2',
choices=setNames(df$value2[df$method1==input$m1], df$method2[df$method1==input$m1]))})}
shinyApp(ui = ui, server = server)
编辑
对于最小示例数据集,@ brittenbs建议将df$method1 == input$m1
替换为df$value1 == as.numeric(input$m1)
解决了该问题。
对于更大的现实生活数据集,我通过构建反应性数据集来采用变通方法
dft <- reactive({df %>% filter(value1 == as.numeric(input$m1))})
并在observeEvent
observeEvent(input$m1,{ updateSelectInput(session,'m2', choices=setNames(dft()$value2, dft()$method2))})