首页 > 解决方案 > 根据复选框输入更改闪亮的条件面板

问题描述

我想要的是

我正在构建一个具有多个 generic 的闪亮应用程序conditionalPanels,每个应用程序的显示取决于来自一个主要复选框的输入。在之前的问题中,我只找到了具有单一条件的条件面板。

假设主要复选框可以输出 1 到 5 之间的任何值,允许多选。

复选框值“1”的单个条件是:

conditionalPanel(condition='input.in_test==1'...

问题

现在,我想将其与复选框的多项选择选项相匹配。我需要的是%in%与正确的数据类型相结合的 R 运算符的 javascript 等效项。我找到了contains()不起作用的方法,因为我可能弄错了数据类型,因为它可能不等于 R 的向量类型。这是复选框值 1 和 2 的内容:

conditionalPanel(condition='if(Arrays.asList(input.in_test).contains(1,2))'

那么,将 R 的%in%运算符转换为这段动态的 Java 代码以使其在conditionalPanel. 谢谢您的帮助!

例子

这是我正在尝试做的一个最小的工作示例,只有一个条件:

sapply(c("tidyverse","shiny","DT"),require,character.only=T)

# helper function for choices
shiny_choices <- function(vector){
  tibble(names=vector) %>%
    mutate(val=1:nrow(.)) %>%
    deframe()
}

# shiny ui
ui <- fluidPage(
  title="This is a test",
  titlePanel(strong("Test")),
  sidebarLayout(
    position="left",
    # Funktions-Panel
    sidebarPanel(
      
      # main checkbox
      fluidRow(
        checkboxGroupInput("in_check_all","Selection",choices=shiny_choices(colnames(iris)),selected=NULL)
      ),
      
      # generic input checkboxes
      lapply(colnames(iris),function(y){
        temp <- shiny_choices(colnames(iris))
        #XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        conditionalPanel(condition=paste0("input.in_check_all==",temp[y]), # this is the critical line that needs to be adapted
        #XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                         fluidRow(
                           checkboxGroupInput(paste0("in_check_",temp[y]),
                                              y, 
                                              choices=sort(unique(iris %>% select(y))[[1]]),
                                              selected=NULL)
                         )
        )
      }),
    ),
    mainPanel(
      DT::dataTableOutput("out_table")
    )
  )
)

# shiny server
server <- function(input,output,session){
  output$out_table <- DT::renderDataTable({
    
    # filter data dependent on input
    x <- iris # %>% ...
    
    DT::datatable(x)
  })
  
}

# app
shinyApp(ui=ui,server=server)

标签: javascriptrshiny

解决方案


您正在寻找的是 javascript's (not Java) includes()。传递的值是字符串,所以我们还必须引用它们:

condition=paste0("input.in_check_all.includes(\"",temp[y],"\")"), 

推荐阅读