我创建了一个 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) { }
)
关于r - 使用 for 循环动态调用 Shiny 模块多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63832656/