Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何访问/记住Shining中未选中的值?_R_Shiny - Fatal编程技术网

R 如何访问/记住Shining中未选中的值?

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中的值

我在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中的对应类别未被取消选择
  • 代码如下:

    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)