Вы можете получить доступ к входам через input[[inputName]]
, где inputName - это имя вашего входа (например, «Sepal.Length-7.9»).Затем вы можете проверить все входы через
if(input[[inputName]]){
split <- strsplit(inputName, "-")[[1]]
name <- split[1]
treshold <- as.numeric(split[2])
global$filter[, inputName ==colnames(filter)] <- iris[name] == treshold
}else{
global$filter[, inputName ==colnames(filter)] = TRUE
}
Входы, которые вы можете создать с помощью renderUI()
:
output$checkBoxes <- renderUI({
lapply(inputNames, function(inputName) checkboxInput(inputName, inputName, FALSE))
})
В примере я использую максимум всех числовых столбцов.
Полный код будет выглядеть так:
restr <- apply(iris, 2, max)[1:4]
inputNames <- paste(names(restr), restr, sep = "-")
filter = sapply(inputNames, function(inputName) c(inputName = return(rep(TRUE, dim(iris)[1]))))
server <- function(input, output, session) {
global <- reactiveValues(filter = filter)
df <- reactive({
for(inputName in inputNames){
if(!is.null(input[[inputName]])){
isolate({
if(input[[inputName]]){
split <- strsplit(inputName, "-")[[1]]
name <- split[1]
treshold <- as.numeric(split[2])
global$filter[, inputName ==colnames(filter)] <- iris[name] == treshold
}else{
global$filter[, inputName ==colnames(filter)] = TRUE
}
})
}
}
iris[rowSums(global$filter) == 4, ]
})
output$checkBoxes <- renderUI({
lapply(inputNames, function(inputName) checkboxInput(inputName, inputName, FALSE))
})
output$table <- DT::renderDataTable(
DT::datatable(df(), options = list(searching = FALSE,pageLength = 25))
)
}
ui <- navbarPage(
title = 'Select values in two columns based on two inputs respectively',
fluidRow(
column(width = 3,
uiOutput("checkBoxes")
),
column(9,
tabPanel('Table', DT::dataTableOutput('table'))
)
)
)
shinyApp(ui, server)