【问题标题】:Update checkboxes from database after actionbutton is clicked in R shiny在 R 闪亮中单击操作按钮后从数据库更新复选框
【发布时间】:2019-03-16 22:19:42
【问题描述】:

我正在创建一个闪亮的应用程序,它将从数据库表中获取值并根据用户请求更新另一个表。单击添加按钮后,就会出现问题。复选框的值与之前的值相同,并且不会从数据库中获取新值。

ui <- fluidPage(

  checkboxGroupInput("inCheckboxGroup", "Available names", td),
  checkboxGroupInput("inCheckboxGroup2", "Present names",c(ch1,ch)),
  actionButton("action", label = "Add")
)

td、ch1 和 ch 是从数据库中收集的列表。

z <- NULL    
server <- function(input, output, session) {

  # checkbox listener
  observe({
    x <- input$inCheckboxGroup
    y <- NULL

    if (is.null(x))
      x <- character(0)

    # Get the names for these ids
    for (i in x){
      y <- dbFetch(dbSendQuery(conn, paste0("--sql query--") ))
      z <- c(z,y[,1])
    }

    # Print the names from previous block into the checkboxes
    updateCheckboxGroupInput(session, "inCheckboxGroup2",
                             choices = c(ch1,z),
                             selected = z)
  })

  # button listener
  observeEvent(input$action,{
    for(i in input$inCheckboxGroup){
      rs <- dbSendQuery(conn, paste0("--sql query--"))
      dbFetch(rs)
    }
    showNotification("Row inserted")
  })
}

我尝试创建一个页面刷新功能或输入重置来解决问题。但即使重新加载页面也无济于事。最好的方法是什么?

【问题讨论】:

  • 为什么observeEvent 中没有updateCheckboxGroupInput 用于单击操作按钮?

标签: r shiny shiny-server shinyjs


【解决方案1】:

按下按钮后,您需要更新复选框,因此updateCheckboxGroupInput 需要位于操作按钮的observeEvent 中。以下是如何执行此操作的示例。

library(shiny)

td<-c(1,2,3)
ch1<-c(1,2,3)
ch<-c(1,2,3)


ui <- fluidPage(
  checkboxGroupInput("inCheckboxGroup", "Available names", td),
  checkboxGroupInput("inCheckboxGroup2", "Present names",c(ch1,ch)),
  actionButton("action", label = "Add")
)

server<-function(input,output,session){

  # button listener
  observeEvent(input$action,{
    database<-c(4,5,6)
    updateCheckboxGroupInput(session,"inCheckboxGroup", choices = database)
    })

  }

shinyApp(ui, server)

如果尝试更新复选框的值,请执行类似的命令,但使用 selected。下面还有如何更新这两组复选框。

  # button listener
  observeEvent(input$action,{
    database<-c(1,3)
    updateCheckboxGroupInput(session,"inCheckboxGroup", selected=database)
    #For the Second group simply call the other label
    updateCheckboxGroupInput(session,"inCheckboxGroup2", selected=database)
    })

 }

【讨论】:

  • 这适用于第一个复选框组,但第二个复选框(现有名称)没有更新。这是否与observe 函数有关,因为单击按钮后,第二个复选框不会更新为第一个复选框?
  • 第二组复选框也需要updateCheckboxInput 调用。表示相同的代码,但使用 "inCheckboxGroup2" 代替。
  • 只需将第二组复选框的调用放在同一个观察事件下,这样当按下按钮时,两组都会更新。
  • 这正是我所做的导致上述(更新失败)。
  • 我猜这与“# checkbox listener”中的先前调用有关,因为这是重置所做的任何更新。去掉那个部分的updateCheckboxInput
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 2021-07-11
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多