【发布时间】:2019-08-20 06:03:15
【问题描述】:
简介
我正在为一些工作制作一个闪亮的应用程序(仪表板)。我有一个名称数据框(从可以扩展的外部 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()
}
})
【问题讨论】:
标签: r shiny shinydashboard shiny-reactivity