#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],"")"),