如何在反应环境之外使用闪亮UI中的变量?

时间:2018-01-17 08:24:23

标签: r shiny

情况:我有一个输入,您可以选择“小”或“大”,一个带有数据和另一个输入的csv文件,您可以从csv中选择一个列表,具体取决于你选择“小”还是“大”。

问题:我找不到在input$selecter函数中访问变量updateSelectizeInput的方法。

这是我的最小代码示例,但遗憾的是不起作用:

library(shiny)

ui=fluidPage(
  selectInput('selecter', "Choose ONE Item", choices = c("small","big")),
    selectizeInput('chooser', 'Choose SEVERAL Items', choices = NULL, multiple = TRUE)
)

server=function(input,output,session){
 DatafromMytable=read.csv("mytable.csv", header=TRUE, sep=";")
 # mysubset=subset(DatafromMytable,Size=="big") #
   mysubset=subset(DatafromMytable,Size==input$selecter)
 updateSelectizeInput(session, "chooser", choices = mysubset$Item) 

}

shinyApp(ui, server)

问题: 我需要在行updateSelectizeInput(session, "chooser", choices = mysubset$Item)中更改哪些内容才能使代码生效?

2 个答案:

答案 0 :(得分:3)

您必须将变量mysubset变为被动,然后使用mysubset()调用其值。此外,只要发现updateSelectizeInput发生了更改,您就需要一个能够触发mysubset()的观察者。

以下示例。请注意,我已对您的read.csv语句进行了注释,并添加了一些示例数据以制作您的示例reproducible。希望这有帮助!

library(shiny)

ui=fluidPage(
  selectInput('selecter', "Choose ONE Item", choices = c("small","big")),
  selectizeInput('chooser', 'Choose SEVERAL Items', choices = NULL, multiple = TRUE)
)

server=function(input,output,session){

  #DatafromMytable=read.csv("mytable.csv", header=TRUE, sep=";")
  DatafromMytable=data.frame(Size=c('small','small','big','big'),Item=c(1,2,3,4))

  mysubset= reactive ({
    subset(DatafromMytable,Size==input$selecter)
    })

  observeEvent( mysubset(),{
  updateSelectizeInput(session, "chooser", choices = mysubset()$Item) 
  })

}

shinyApp(ui, server)

答案 1 :(得分:1)

最简单的解决方案似乎只是将具有反应变量的两行包裹在observe({ ... })中。

 observe({  
 mysubset=subset(DatafromMytable,Size==input$selecter)
 updateSelectizeInput(session, "chooser", choices = mysubset$Item) 
 })