如何在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