r - 如何访问/记住 Shiny 中未经检查的值?

标签 r shiny

我正在 R 中摆弄一个 Shiny 的应用程序。该应用程序有

  • 一个选择列表输入 A(主要组),可能的值为 A、B 和/或 C
  • 一组复选框Input b(子组),它们是 由 Input A 列表中的选择动态填充:chkb a 和 chkb b 代表 A,c,d 代表 B,和/或 e,f 代表 C
  • 带有映射的数据框df

这是它的样子:

enter image description here

我的问题是 Input b 忘记了以前未选中哪些复选框。因此 - 关于屏幕录制 - 值 b 必须再次取消选中列表 Input A 中的每个新选择。

问:如何修改下面的代码,这样

  1. 新添加输入 A 中的列表项仍在输入 b自动检查,并且
  2. 以前未检查 来自输入 b 的值被记住;至少只要 Input A 中的相应类别未被选中

代码如下:

library(shiny)
df <- data.frame(
  a = rep(LETTERS[1:3], each = 2), 
  b = letters[1:6]
)

ui <- fluidPage(
  column(6, selectInput("selectinput", "Input A", levels(df$a), multiple = T)),
  column(6, checkboxGroupInput("checkinput", "Input b", NULL))
)

server <- function(input, output, session) {
  observe({
    allPossibleB <- df$b[df$a %in% input$selectinput]
    updateCheckboxGroupInput(session, 
      "checkinput", "Input b",
      choices = allPossibleB,
      selected = setdiff(allPossibleB, NULL), # <=== previously unchecked instead NULL?
      inline = TRUE
    )
  })
}

shinyApp(ui, server)

我尝试了几件事,但我认为不值得一提,因为我对 Shiny 和基本概念没有太多经验。也许有一种简单的方法不仅可以访问输入小部件的选中值?

在此先感谢您的任何提示和帮助!

最佳答案

您可以使用 reactiveValues() 来记住选中的值。

我对命名列表进行了编辑,以存储选中框的信息。如果您计划按字母顺序选择 input A,这是必需的,..

checked <- as.list(rep(T, length(df$b)))
names(checked) <- df$b

在应用程序内部,由于某些原因,input$selectinput 更新速度比 input$checkinput 快,因此您必须使用 isolate()这会导致选择逻辑出现问题。所以我们只想在 input$checkinput 发生变化时更新。是的,我使用 for 循环来更新(未)检查值的列表 :)。

  global <- reactiveValues(checked = checked)

  observe({
    input$checkinput
    isolate({
      if(!is.null(input$checkinput)){
        possible <- as.character(df$b[df$a %in% input$selectinput])
        for(nr in 1:length(possible)){
          global$checked[[possible[nr]]] <- (possible %in% input$checkinput)[nr]
        }
      }
    })
  })

完整的应用程序将是:

library(shiny)

df <- data.frame(
  a = rep(LETTERS[1:3], each = 2), 
  b = letters[1:6]
)

checked <- as.list(rep(T, length(df$b)))
names(checked) <- df$b


ui <- fluidPage(
  column(6, selectInput("selectinput", "Input A", levels(df$a), multiple = T)),
  column(6, checkboxGroupInput("checkinput", "Input b", NULL))
)

server <- function(input, output, session) {
  global <- reactiveValues(checked = checked)

  observe({
    input$checkinput
    isolate({
      if(!is.null(input$checkinput)){
        possible <- as.character(df$b[df$a %in% input$selectinput])
        for(nr in 1:length(possible)){
          global$checked[[possible[nr]]] <- (possible %in% input$checkinput)[nr]
        }
      }
    })
  })

  observe({
    allPossibleB <- df$b[df$a %in% input$selectinput]
    updateCheckboxGroupInput(session, 
                             "checkinput", "Input b",
                             choices = allPossibleB,
                             selected = df$b[unlist(global$checked)], # <=== previously unchecked instead NULL?
                             inline = TRUE
    )
  })
}

shinyApp(ui, server)

关于r - 如何访问/记住 Shiny 中未经检查的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44478182/

相关文章:

regex - R中的正则表达式。捕获特定字段

r - 在两个字符之间使用 "colon"作为 lm() 中的回归量

主面板的 Rstudio Shiny 条件面板

javascript - 点击操作按钮的那一刻

R Shiny 的隐藏/显示操作按钮

javascript - R:如何在 Shiny 中初始化数据表 FixedColumns javascript?

r - R 中支持 Callback_Early_Stopping

替换两列中的 NA

r - 当用户输入 numericInput 时更改数据帧值

r - 使用 actionButtons 根据索引动态添加和删除 uiOutput 元素