checkboxGroupInput在observeEvent之前更新

时间:2018-07-06 18:45:14

标签: r shiny reactive

我试图在单击“提交”按钮后获取在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))
 })

1 个答案:

答案 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