我正在 R 中摆弄一个 Shiny 的应用程序。该应用程序有
- 一个选择列表输入 A(主要组),可能的值为 A、B 和/或 C
- 一组复选框Input b(子组),它们是 由 Input A 列表中的选择动态填充:chkb a 和 chkb b 代表 A,c,d 代表 B,和/或 e,f 代表 C
- 带有映射的数据框
df
这是它的样子:
我的问题是 Input b 忘记了以前未选中哪些复选框。因此 - 关于屏幕录制 - 值 b 必须再次取消选中列表 Input A 中的每个新选择。
问:如何修改下面的代码,这样
- 新添加输入 A 中的列表项仍在输入 b 中自动检查,并且
- 以前未检查 来自输入 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/