r - 使用 for 循环动态调用 Shiny 模块多次

标签 r shiny shinydashboard

我创建了一个 Shiny 的模块,它显示的文本输入数量与一行中另一个变量的长度一样多。

如果我手动依次调用这些模块,它就可以正常工作:

library(shiny)
library(shinydashboard)

scenarios <- c("Scenario 1", "Scenario 2", "Scenario 3", "Scenario 4")

scenarioInput <- function(id, nomScenario){
  ns <- NS(id)
  textInput(inputId = ns("scenario"), label=nomScenario)
}

box1 <- shinydashboard::box(width=NULL, status="primary", align="center",
            HTML("<h1><strong>Scénarios</strong></h1>"), 
            splitLayout(
              cellWidths = rep(paste0(100/length(scenarios), "%"), length(scenarios)),   
              cellArgs = list(style = "padding: 2%"),
              scenarioInput(id=1, nomScenario=scenarios[1]),
              scenarioInput(id=2, nomScenario=scenarios[2]),
              scenarioInput(id=3, nomScenario=scenarios[3]),
              scenarioInput(id=4, nomScenario=scenarios[4])
            )
)

body <- dashboardBody(
  fluidRow(
    column(width = 12,
           box1,
    )
  )
)


ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  body
)

shinyApp(ui = ui, server = function(input, output) { })

但是,如果我尝试通过 for 循环调用这些模块,则屏幕上不会显示文本输入框。

box1 <- shinydashboard::box(width=NULL, status="primary", align="center",
            HTML("<h1><strong>Scénarios</strong></h1>"), 
            splitLayout(
              cellWidths = rep(paste0(100/length(scenarios), "%"), length(scenarios)),   
              cellArgs = list(style = "padding: 2%"),
              for (i in 1:length(scenarios)){scenarioInput(id=i, nomScenario=scenarios[i])}
            )
)

有人知道如何实现这项工作吗?

最佳答案

您需要将 textInputs 作为参数传递给 splitLayout。 这可以通过 do.call 来完成:

library(shiny)
library(shinydashboard)

scenarios <- c("Scenario 1", "Scenario 2", "Scenario 3", "Scenario 4")

scenarioInput <- function(id, nomScenario) {
  ns <- NS(id)
  textInput(inputId = ns("scenario"), label = nomScenario)
}

box1 <- shinydashboard::box(
  width = NULL,
  status = "primary",
  align = "center",
  HTML("<h1><strong>Scénarios</strong></h1>"),
  do.call(
    what = splitLayout,
    args = c(
      lapply(seq_along(scenarios), function(i) {
        scenarioInput(id = i, nomScenario = scenarios[i])
      }),
      list(cellWidths = list("10%", "20%", "30%", "40%")), # list(cellWidths = rep(paste0(100 / length(scenarios), "%"), length(scenarios))),
      list(cellArgs = list(style = "padding: 2%"))
    )
  )
)

body <- dashboardBody(fluidRow(column(width = 12, box1)))


ui <- dashboardPage(dashboardHeader(),
                    dashboardSidebar(),
                    body)

shinyApp(
  ui = ui,
  server = function(input, output) {  }
)

result

关于r - 使用 for 循环动态调用 Shiny 模块多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63832656/

相关文章:

css - 定位 R Shiny 的 selectInput 小部件

r - 当 Shiny Dashboard 中存在 menuSubItems 时显示 menuItem 的内容

r - 如何在模块化 Shiny 应用程序中连接 AWS S3 凭证

R Shiny 仪表板仅加载一次选项卡

r - 使用 R 绘制甘特图

r - Shiny 在本地主机上工作正常,但在远程主机上却不行,Windows 上的 shiny-server.conf 在哪里?

r - 切换和 tabsetPanel 的 Shiny 命名空间问题

r - 如何将 UTC 时间戳转换为 R Data Frame 中的多个本地时区?

r - 使用 data.table 优化具有唯一节点的节点匹配目标

r - 设置矩阵值与 R 中的向量比较