R 如何访问/记住Shining中未选中的值?
我在R里摆弄着一个闪亮的应用程序。这个应用程序已经R 如何访问/记住Shining中未选中的值?,r,shiny,R,Shiny,我在R里摆弄着一个闪亮的应用程序。这个应用程序已经 选择列表输入a(主要组)和可能的值a、B 和/或C 一组复选框输入b(子组),它们是 由输入列表中的选择动态填充:chkb A和chkb b代表A,c,d代表b,和/或e,f代表c 带有映射的数据帧df 下面是它的样子: 我的问题是输入b忘记了以前未选中的复选框。因此,对于屏幕记录,必须在列表输入A中的每个新选择中再次取消选中值b Q:我如何更改下面的代码以便 新添加的输入A中的列表项仍会在输入b中自动选中,并且 以前未选中的输入b中的值
- 选择列表输入a(主要组)和可能的值a、B 和/或C
- 一组复选框输入b(子组),它们是 由输入列表中的选择动态填充:chkb A和chkb b代表A,c,d代表b,和/或e,f代表c
- 带有映射的数据帧
df
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)
库(闪亮)
df
或者,如果您有“无”选项:
column(6, updateCheckboxGroupInput("checkinput", "Input b", NULL, selected = if(is.null(input$checkinput)){"none"}else{input$checkinput}))
为了将它们与A、B、C分组,您可以创建反应值来存储每个组的选择,并使用观察者来更改输入中的活动组。我很快就会发布代码
这是承诺的代码,我对BigData的回答
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 = TRUE)),
column(6, checkboxGroupInput("checkinput", "Input b", NULL))
)
server <- function(input, output, session) {
checkin <- reactiveValues(A = NULL,B = NULL, C = NULL,puts = NULL)
observeEvent(input$selectinput,{
if("A" %in% input$selectinput){
checkin$A <- input$checkinput[which(input$checkinput %in% df$b[which(df$a[df$b] == "A")])]
}
if("B" %in% input$selectinput){
checkin$B <- input$checkinput[which(input$checkinput %in% df$b[which(df$a[df$b] == "B")])]
}
if("C" %in% input$selectinput){
checkin$C <- input$checkinput[which(input$checkinput %in% df$b[which(df$a[df$b] == "C")])]
}
checkin$puts <- c(if(!is.null(checkin$A)){checkin$A},if(!is.null(checkin$B)){checkin$B},if(!is.null(checkin$C)){checkin$C})
})
observe({
allPossibleB <- df$b[df$a %in% input$selectinput]
updateCheckboxGroupInput(session,
"checkinput", "Input b",
choices = allPossibleB,
selected = checkin$puts ,
inline = TRUE
)
})
}
shinyApp(ui, server)
库(闪亮)
df您可以使用reactiveValues()
来记住选中的值
我对命名列表进行了编辑,以存储复选框的信息。如果您计划按字母顺序选择输入一个
,这是必要的
checked <- as.list(rep(T, length(df$b)))
names(checked) <- df$b
完整的应用程序将是:
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)
库(闪亮)
谢谢你的意见。使用selected=input$checkinput
时,行为没有改变,还是我犯了错误?我也在玩弄反动价值观。但是,没有任何选项同时满足条件1。(自动检查新的)和2。(记住旧的)。很抱歉,您应该在updateCheckboxGroupInput
中使用selected=input$checkinput,它似乎仍然不起作用,但是在reactiveValues对象中存储一种查找表是个好主意。但我想如果不花几个小时,我永远也不会让它工作——这不是太直观了……谢谢你的建议。结果不就是仅仅做checkin更改reactiveValues(A=c(“A”、“b”)的结果吗…
也可以做到这一点。它是六个半打的其他,就像大多数关于R的事情一样。我没有把我的答案的附录作为一个更好的答案来发布,就像如果让我自己去做的话,我会这样做。在组中设置值状态的能力是两者之间的唯一区别,本质上。你可以让一组关闭,一组打开,另一组关闭,一组打开。仅使用input$selectinput无法实现这一点。这正是我刚才所说的。哈哈,我不得不跑去和女朋友一起吃饭,但还没有发布代码。实际上,我从想法到代码都花了一点时间,不像预期的那么简单,…我意识到这只会起作用s如果你选择按字母顺序输入一个
,否则它的赋值就不同了。但它显示了足够好的总体思路,@BigDataScientist,很好,这很有效-谢谢。输入$checkinput
在观察({
和`隔离'之间是什么({`do?似乎很关键,但我不明白其中的意思。:-?@BigDataScientist最后但并非最不重要的一点:选择一个列表是一个品味问题,对吗?矢量爱好者可能想把它改成类似于global@lukeA:看到这句话“所以我们只想在input$checkinput
发生变化时更新。”这就是我对输入和隔离所做的,…您也可以使用observeEvent()
来代替。当然,命名向量也可以工作,…在我看来,实际上是更好的选择。后续代码看起来不错,但很难说没有测试:)
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)