我试图在单击“提交”按钮后获取在checkboxGroupInput中选择的值,以显示在多个选项卡的主面板中。使用observeEvent,首次选择的选项在单击提交按钮之前不会显示在主面板中,但是之后,选择后的值将在主面板中显示而不提交。我该怎么做,所以必须在主面板更新之前单击提交?
library(shiny)
ui <- fluidPage(
titlePanel(
"Example"),
sidebarLayout(
sidebarPanel(
checkboxGroupInput("choice", label = "Choose Letter",
choices = list("A", "B", "C", "D")),
actionButton("submit", "Submit"),
width=3
),
mainPanel(
tabsetPanel(
navbarMenu("Pages",
tabPanel("Page 1", h3(htmlOutput("choice1"))),
tabPanel("Page 2", h3(textOutput("choice2")))
)
)
)
)
)
server <- function(input, output) {
observeEvent(input$submit,{
lapply(1:2, function(nr){
output[[paste0("choice",nr)]]<-renderText({choose<-paste(input$choice, collapse=", ")
paste(choose)})
})
})
}
shinyApp(ui = ui, server = server)
我还尝试了eventReactive,这是我以前从未使用过的,所以我不确定我是否理解它。在服务器中使用以下代码,出现错误“ as.vector中的错误:无法将类型'closure'强制转换为类型为'character'的vector“
a<-eventReactive(input$submit,{
paste(input$choice, collapse=", ")
})
lapply(1:2, function(nr){
output[[paste0("choice",nr)]]<-renderText(paste(a))
})
答案 0 :(得分:1)
我将发布解决方案,但只需很少的解释,希望有人可以提出并解释更多或纠正我的观点。
首先:renderText
直接与“或依赖” input$choice
交互,因此input$choice
中的任何更新或更改都将反映在renderText上。要解决此依赖性问题,您需要一个占位符,该占位符取决于使用observeEvent
reactiveValues
触发或的
server <- function(input, output) {
data <- reactiveValues()
observeEvent(input$submit,{
data$nr <- input$choice
lapply(1:2, function(nr){
utput[[paste0("choice",nr)]]<-renderText({choose<-paste(data$nr, collapse=", ")
paste(choose)})
})
})
}
第二:使用eventReactive
创建的任何对象都与使用reactive
创建的对象相同,它们都是函数,在调用时应使用()
进行调用,例如在您的情况下,a
的调用应如下a()
a<-eventReactive(input$submit,{
paste(input$choice, collapse=", ")
})
lapply(1:2, function(nr){
output[[paste0("choice",nr)]]<-renderText(paste(a()))
})
有关闪亮的反应性和依赖性的更多信息,可以检查here