Введение
Я делаю блестящее приложение (панель инструментов) для какой-то работы. У меня есть фрейм данных имен (сгенерированный из внешнего файла Excel, который может быть расширен, таким образом, требуется реактивность), который должен генерировать collapsePanel
(из bsCollapse
) для каждого имени в вышеупомянутом списке. Это уже реализовано и работает с использованием renderUI
на сервере; тем не менее, теперь я действительно хочу изменить входные данные, включенные в collapsePanel
: у меня есть несколько входов на панели, но самый важный, который я покажу в этом примере, это группа флажков. Моя проблема возникает, когда я хочу использовать входные данные группы флажков в функции (например, для сохранения новой информации).
Минимальный рабочий пример
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, shiny, shinythemes, sweetalertR, shinyWidgets,
shinycssloaders, shinyBS, shinyjs, shinydashboard, rlist, readxl)
list_of_names <- tibble("Name" = c("Name1", "Name2", "Name3"),
"0 pt" = c("Criteria 0 name1", "Criteria 0 name2", "Criteria 0 name3"),
"1 pt" = c("Criteria 1 name1", "Criteria 1 name2", "Criteria 1 name3"),
"2 pt" = c("Criteria 2 name1", "Criteria 2 name2", "Criteria 2 name3"))
t <- c()
for (i in list_of_names$Name) {
t <- c(t, paste0("input$", i, "_id"))
}
mycollapse <- lapply(1:nrow(list_of_names), function(i) {
bsCollapsePanel(paste0(list_of_names$Name[i]),
awesomeCheckboxGroup(inputId = paste0(list_of_names$Name[i], "_id"),label = NULL,
choices = as.character(list_of_names[i,2:4]),
status = "success", width = "75%"))
})
mycollapse[["id"]] <- "collapseID"
mycollapse[["multiple"]] <- FALSE
mycollapse[["open"]] <- "Name1"
#### UI ----------
ui <- dashboardPage(
dashboardHeader(title = "Minimal Example"),
dashboardSidebar(
sidebarMenu(
menuItem("Dashboard", tabName = "Dashboard", icon = icon("dashboard"),
selected = TRUE))),
dashboardBody(
fluidPage(
column(6, shinyjs::useShinyjs(), withSpinner(uiOutput("Data"))))))
server <- function(input, output, session) {
output$Data <- renderUI({
tagList(
do.call(bsCollapse, args = mycollapse) %>% return(),
actionButton("Save", "Save"))
})
observeEvent(input$Save, {
confirmSweetAlert(session, inputId = "Save_SWAL", title =
"Save?", text = "Are you sure?",
type = "warning", danger_mode = TRUE, btn_labels = c("Cancel", "Yes, save please"))
})
observeEvent(input$Save_SWAL, {
if (isTRUE(input$Save_SWAL)) {
# SOMETHING HERE
}
})
}
shinyApp(ui, server)
Задача
Моя проблема сейчас в том, что я хочу использовать input$Name1_id
, input$Name2_id
и input$Name3_id
в функции, где в коде написано «ЧТО-ТО ЗДЕСЬ», например, для преобразования выбранных баллов в максимальные и минимальные значения. когда я нажимаю на кнопку действия.
Итак, в основном я хочу следующее, но реактивно:
observeEvent(input$Save_SWAL, {
if (isTRUE(input$Save_SWAL)) {
list(
"Result1" = list("min" = min(input$Name1_id), "max" = max(input$Name1_id)),
"Result2" = list("min" = min(input$Name2_id), "max" = max(input$Name2_id)),
"Result3" = list("min" = min(input$Name3_id), "max" = max(input$Name3_id))
) %>% print()
}
})
Как я могу сделать это, используя цикл for и применить?
Я пытался использовать eval()
и do.call()
в строке символов, например: "input$Name1_id"
; однако ни один из этих вариантов, похоже, не помогает.
observeEvent(input$Save_SWAL, {
if (isTRUE(input$Save_SWAL)) {
sapply(do.call(t), min) %>% print()
}
})