【问题标题】:R shiny updateCheckboxGroupInput does not work as expectedR闪亮的updateCheckboxGroupInput无法按预期工作
【发布时间】:2016-10-20 12:51:13
【问题描述】:

我想知道为什么我所有的复选框都没有用这段代码选中?

我有 1 个名为“county”的 checkboxGroupInput,其中有 3 个复选框和另一个 命名为“动态”,带有 33 个复选框。而且我想知道为什么,当我选中“县”checkboxGroupInput的两个或三个复选框时,“动态”checkboxGroupInput中的依赖复选框没有选中。只有选中一个框才能正常工作。

非常感谢您的帮助。

这是 Server.R:

observeEvent(input$dynamic_county, {
if(is.element((input$dynamic_county),("South")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("02","03","05","06","09","13","16","17","18","21","28","29",
"32"))}})

observeEvent(input$dynamic_county, {
if(is.element((input$dynamic_county),("North")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("01","04","07","08","10","11","12","19","22","23","24","25","26",
"27","30","31","33"))}})

observeEvent(input$dynamic_county, {
if(is.element((input$dynamic_county),("East")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("14","15","20"))}})

再次感谢您。

@Waroverflow,谢谢你的建议,但它不起作用,我试过这个:

observeEvent(input$dynamic_county, {
if(is.element((input$dynamic_county),("South")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("02","03","05","06","09","13","16",
"17","18","21","27","28","29","32"))}

if(is.element((input$dynamic_county),("North")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("01","04","07","08","10","11","12","19",
"22","23","24","25","26","27","30","31","33"))}

if(is.element((input$dynamic_county),("East")))
{updateCheckboxGroupInput(session, inputId = "dynamic", selected = 
list("14","15","20"))}
   })

我也试过了:

observeEvent(input$dynamic_county, {
ifelse((is.element((input$dynamic_county),
("South"))),updateCheckboxGroupInput(session, inputId = "dynamic", 
selected = list("02","03","05","06","09","13","16",
"17","18","21","27","28","29","32")),


ifelse((is.element((input$dynamic_county),
("North"))),updateCheckboxGroupInput(session, inputId = "dynamic", 
selected = list("01","04","07","08","10","11","12","19",
"22","23","24","25","26","27","30","31","33")),

 ifelse((is.element((input$dynamic_county),
("East"))),updateCheckboxGroupInput(session, inputId = "dynamic", 
selected = list("14","15","20")),
updateCheckboxGroupInput(session, inputId = "dynamic",selected = 
NULL))))})

如果我选中 2 个或 3 个复选框,则只执行其中一个。

请问您对问题的根源有什么想法吗?

再次非常感谢您。

编辑:

我知道 dynamic_choices 是用于标签的,所以我已经包含了我的最终标签,但它不起作用。我很失望地意识到我没有理解。这是我所做的:

library(shiny)
library(stringr)

dynamic_choices = c("01. Bélep", "02. Boulouparis", "03. Bourail",
                    "04. Canala", "05. Dumbéa", "06. Farino",
                    "07. Hienghène", "08. Houaïlou", "09. Ile des Pins", 
                    "10. Kaala Gomen", "11. Koné", "12. Koumac",
                    "13. La Foa", "14. Lifou", "15. Maré",
                    "16. Moindou", "17. Mont Dore", "18. Nouméa",
                    "19. Ouégoa", "20. Ouvéa", "21. Païta",
                    "22. Poindimié", "23. Ponérihouen", "24. Pouébo",
                    "25. Pouembout", "26. Poum", "27. Poya",
                    "28. Sarraméa", "29. Thio", "30. Touho", "31. Voh",
                    "32. Yaté", "33. Kouaoua")

selection = list("Province Nord"=c("01. Bélep", "04. Canala",
                "07. Hienghène", "08. Houaïlou", "10. Kaala Gomen",
                "11. Koné", "12. Koumac", "19. Ouégoa", "22. Poindimié",
                "23. Ponérihouen", "24. Pouébo", "25. Pouembout",
                "26. Poum", "27. Poya", "30. Touho", "31. Voh",
                "33. Kouaoua"),
                  "Province Sud"=c("02. Boulouparis", "03. Bourail",
                "05. Dumbéa", "06. Farino", "09. Ile des Pins",
                "13. La Foa", "16. Moindou", "17. Mont Dore", 
                "18. Nouméa", "21. Païta", "28. Sarraméa",
                "29. Thio", "32. Yaté"),
                   "Province des Iles Loyauté"=c("14. Lifou",
                "15. Maré","20. Ouvéa"))

ui <- shinyUI(fluidPage(

   titlePanel("Update CheckboxGroupInput"),

   sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("dynamic_provinces", "Provinces", c("Province 
                    Nord", "Province Sud", "Province des Iles Loyauté")),
      checkboxGroupInput("dynamic", "Communes", dynamic_choices)
    ),

    mainPanel(
   )
 )
))

还有 Server.R 代码:

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

  observeEvent(input$dynamic_provinces, {
     selected = c()

    for (s in input$dynamic_provinces) {
      selected = c(selected, selection[[s]])
    }
       if (is.null(selected)) {
      selected = character(0)
    }
     updateCheckboxGroupInput(session, "dynamic", selected = selected)
   }, ignoreNULL = FALSE)

})

非常感谢。

【问题讨论】:

  • 你应该只有一个 observeEvent 而不是三个 observeEvent 并将所有 if 语句放在里面。
  • 主要问题是,当您选中第一组中的多个框时,您需要将第二个复选框组中的所有相应选项组合在一起。看我的回答

标签: r shiny


【解决方案1】:

这是一个工作示例。例如,当您同时选择“南”和“北”时,您需要为两者选择相应的框。您问题中的代码仅选择与其中一个对应的框,因此问题。

observeEvent还需要将ignoreNULL设置为FALSE,否则清空所有框时不会得到事件。

library(shiny)
library(stringr)

dynamic_choices = c(1:33)
dynamic_choices = str_pad(as.character(dynamic_choices), 2, side="left", pad="0")
selection = list("South"=c("02","03","05","06","09","13","16","17","18","21","28","29","32"),
                 "North"=c("01","04","07","08","10","11","12","19","22","23","24","25","26","27","30","31","33"),
                 "East"=c("14","15","20"))

ui <- shinyUI(fluidPage(

   titlePanel("Update CheckboxGroupInput"),

   sidebarLayout(
      sidebarPanel(
        checkboxGroupInput("county", "County", c("South", "North", "East")),
        checkboxGroupInput("dynamic", "Dynamic", dynamic_choices)
      ),

      mainPanel(
      )
   )
))

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

  observeEvent(input$county, {
    selected = c()

    for (s in input$county) {
      selected = c(selected, selection[[s]])
    }
    # This is needed due to a bug in Shiny, see https://github.com/rstudio/shiny/issues/831
    if (is.null(selected)) {
      selected = character(0)
    }
    updateCheckboxGroupInput(session, "dynamic", selected = selected)
  }, ignoreNULL = FALSE)

})

shinyApp(ui = ui, server = server)

【讨论】:

  • 非常感谢您帮助 Warmoverflow。不幸的是,当我将您的答案复制到我的 R-Studio 时,当我选中一个或多个“县”框时没有任何反应。我不知道为什么。
  • 您使用的是什么版本的 R 和 Shiny?也尝试重新启动 RStudio 或计算机。我已经在两台计算机上检查了代码,并且都可以正常工作。
  • 你是对的 Warmoverflow,我已经重新启动了 R-Studio,一切正常。非常感谢您的代码,它很完美。我现在更好地理解它是如何工作的。并感谢您也回答了我的其他主题。祝你有美好的一天。
  • 还有一个问题:为什么我必须首先在控制台中创建对象“dynamic_choices”和“selection”?如果我不这样做,就会出现错误,因为 R 没有找到这些对象?非常感谢。
  • 这很奇怪,因为 R 应该创建这些对象(或者通常,R/Shiny 应该首先运行 ui/server 之外的任何代码)。可能和R的版本或者shiny有关,但是很难说。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多