gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:10:25 24 4
gpt4 key购买 nike

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

  • 一个选择列表输入 A(主要组),可能的值为 A、B和/或 C
  • 一组复选框Input b(子组),它们是由 Input A 列表中的选择动态填充:chkb a 和 chkbb 代表 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com