Изменение блестящей условной панели на основе ввода флажка

#javascript #r #shiny

#javascript #r #блестящий

Вопрос:

Чего я хочу

Я создаю блестящее приложение, которое имеет несколько общих conditionalPanels , каждое из которых отображается в зависимости от ввода, поступающего от одного основного флажка. В предыдущих вопросах я нашел только условные панели с одним условием.

Допустим, основной флажок может выводить любые значения от 1 до 5, что позволяет выбирать несколько вариантов.

Единственным условием для значения флажка «1» будет:

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

Проблема

Теперь я хочу подогнать это к параметрам множественного выбора флажка. Что мне нужно, так это эквивалент javascript %in% оператора R в сочетании с правильным типом данных. Я нашел метод contains() , который не работает, потому что я, вероятно, неправильно определил тип данных, поскольку он, вероятно, не равен векторному типу R. Вот что у меня есть для значений флажка 1 и 2:

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

Итак, каков правильный способ перевести %in% оператор R в этот динамический фрагмент кода 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)
 

Ответ №1:

То, что вы ищете, — это javascript (не Java) includes() . Передаваемые значения являются строками, поэтому мы также должны заключать их в кавычки:

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