如何在R中存储复选框输入值?

如何在R中存储复选框输入值?,r,shiny,reactive-programming,reactive,shiny-reactivity,R,Shiny,Reactive Programming,Reactive,Shiny Reactivity,我有一个selectinput()小部件,允许用户从下拉列表中选择变量/列。然后,我有一个带有5个复选框选项的checkboxGroupInput(),比如a、B、C、D和E,还有一个用于重置值的操作按钮。我想将每个变量链接到每个复选框选项。在更改之前,如何为每个变量存储这些复选框值?我想在主面板中打印一个表,第一列由变量和5个二进制列a到E组成,初始值设置为零 当用户选择变量并选中复选框时,必须更新这些值。例如,假设我首先从iris数据集中选择Sepal.Length并检查值A、C。即使我选择

我有一个
selectinput()
小部件,允许用户从下拉列表中选择变量/列。然后,我有一个带有5个复选框选项的
checkboxGroupInput()
,比如a、B、C、D和E,还有一个用于重置值的操作按钮。我想将每个变量链接到每个复选框选项。在更改之前,如何为每个变量存储这些复选框值?我想在主面板中打印一个表,第一列由变量和5个二进制列a到E组成,初始值设置为零

当用户选择变量并选中复选框时,必须更新这些值。例如,假设我首先从iris数据集中选择Sepal.Length并检查值A、C。即使我选择了其他变量,我也希望保持变量Sepal.Length的选项A和C处于选中状态,然后重新选择Sepal.Length,除非它们未选中或按下重置按钮。因此,对于A列和C列,行包含Sepal.Length的表应更新为1

重置按钮应重置所有存储的值。在我的示例中,我确实包含了重置按钮。我还没有真正考虑过如何让它工作,因为这不是我最关心的问题。我自己也许能弄明白。 另外,我想添加另一个特性,一些复选框选项需要根据某些条件冻结某些变量。让我们假设分类变量的选项E。因此,当选择分类变量种类时,复选框选项E将被冻结。不用说,表中包含物种的行E列的值始终为零。
我想我可能必须结合使用
reactiveValues()
observeEvent()
来存储以前的值,然后使用
renderUI()
,但我以前没有使用过
reactiveValues()
。所以,如果有人能在这方面给我一点指引,那将是非常有用的。谢谢

更新:
通过使用
reactiveValues()
observeEvent()
,我能够根据用户操作动态填充表。下一步是更新复选框

library(reactlog)
reactlog::reactlog_enable()
library(shiny)
library(shinyjs)
library(shinyWidgets)
library(tidyverse)

data("iris")


ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            shiny::selectInput(inputId="select_var",
                label="Select a variable",
                choices = names(iris)
                ),
            checkboxGroupInput(
                inputId = "check_values",
                label = "Check the following:",
                choices = LETTERS[1:5],
                selected = NULL
            ),
            actionButton("reset",
                         "Reset values")),
            
            mainPanel(
                DT::DTOutput("out_table")
            )
        
        
    )
    
    )

    

server <- function(input, output, session) {
 
    
    #create a df assigning 0 to all checkbox options and add a new column containing variable names of the data
    df <- tibble::as_tibble(matrix(nrow = length(iris),ncol = 5)) %>% 
        `colnames<-`(LETTERS[1:5]) %>% 
        mutate(across(.cols = everything(),~replace_na(.x,0))) %>% 
        add_column(columns=names(iris))
    
  
    
   #create a temporary df filtered by currently selected variable and showing positive values for checkboxes selected
  
    temp_df <- eventReactive(c(input$select_var,input$check_values),{
        
      new_df <-   rep(1,length(input$check_values)) %>%
            t() %>% as_tibble() %>%
            `colnames<-`(input$check_values) %>%
            mutate(columns=input$select_var)
      
      df %>% 
          rows_update(new_df,by="columns") %>% 
          filter(columns==input$select_var)
        })

    #creating a reactiveValues() object to store previous values 
    rv_df <- reactiveValues(cur_df=df,last_df=df)
    
    
    #storing previous value to rv_df$last_df and current value in rv_df$cur_df
    observeEvent(c(input$select_var,input$check_values),{
        req(input$select_var)
        rv_df$last_df <- rv_df$cur_df
        rv_df$cur_df <- rv_df$last_df %>% rows_update(temp_df(),by="columns")
    })
    
    
    last_df <- reactive({
        req(input$select_var)
        rv_df$last_df
    })
    
    cur_df <- reactive({
        req(input$select_var)
        rv_df$cur_df
    })
    
    

    #reset values (this is incorrect)
    observeEvent(input$reset, {
        reset("check_values")
    })
    

    
    output$out_table <- DT::renderDT({
        cur_df()
    }
    )
    
    
}

if (interactive())
    shinyApp(ui, server)



库(reactlog)
reactlog::reactlog_enable()
图书馆(闪亮)
图书馆(shinyjs)
图书馆(shinyWidgets)
图书馆(tidyverse)
数据(“iris”)
ui%
`colnames%
变异(列=输入$select\u变量)
df%>%
行\u更新(新的\u df,by=“columns”)%>%
过滤器(列==输入$select\u变量)
})
#创建reactiveValues()对象以存储以前的值
rv_df