R - 闪亮的条件输入
问题描述:
我想获得依赖于以前的输入的输入选择。R - 闪亮的条件输入
require(shiny)
require(dplyr)
dat <- data.frame(id1 = c(rep("A",5),rep("B",5)),
id2 = c(rep("C",3),rep("D",3),rep("E",4)),
id3 = c(rep("F",2),rep("G",3),rep("H",5)), stringsAsFactors=FALSE)
ui <- shinyUI(fluidPage(
sidebarPanel(
selectInput('id1', 'ID1', choices = unique(dat$id1)),
selectInput("id2", "ID2", choices = unique(dat$id2)),
selectInput("id3", "ID3", choices = unique(dat$id3))
)
)
)
server <- function(input, output,session) {
observeEvent(
{
input$id1
},{
input$id2
temp <- dat %>% filter(id1%in%input$id1)
updateSelectInput(session,"id2",choices = unique(temp$id2))
}
)
}
shinyApp(ui = ui, server = server)
这适用于输入1和2,但是如果我添加其他输入到observeEvent
,应用程序chrashes。例如:
server <- function(input, output,session) {
observeEvent(
{
input$id1
},{
input$id2
temp <- dat %>% filter(id1%in%input$id1)
updateSelectInput(session,"id2",choices = unique(temp$id2))
},{
input$id3
temp <- dat %>% filter(id1%in%input$id1 & id2%in%input$id2)
updateSelectInput(session,"id3",choices = unique(temp$id3))
}
)
}
如何将其他输入传递给observeEvent
?
答
更新:我找到了问题的解决方案。我将输入包装在一个reactive
函数中,分割输出并将其传递给相应的observeEvent
函数。
server <- function(input, output,session) {
change <- reactive({
unlist(strsplit(paste(c(input$id1,input$id2,input$id3),collapse="|"),"|",fixed=TRUE))
})
observeEvent(input$id1,{
temp <- dat %>% filter(id1 %in% change()[1])
updateSelectInput(session,"id2",choices = unique(temp$id2))
}
)
observeEvent(input$id2,{
temp <- dat %>% filter(id1 %in% change()[1] & id2 %in% change()[2])
updateSelectInput(session,"id3",choices = unique(temp$id3))
}
)
}
+0
想知道,这个解决方案的工作? –
+1
@TedoG。是的,对我来说工作很好。 – count
你可以分享控制台中出现什么错误吗? –
@TedoG。 '.getReactiveEnvironment()中的错误$ currentContext(): 没有活动的被动上下文,不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)'这很奇怪,因为输入在反应式表达式中。 – count
您是否尝试将'dat'数据变量移动到反应表达式中? –