#r #shiny #shinydashboard
#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])}
)
)
Кто-нибудь знает способ заставить это работать?
Ответ №1:
Вам нужно передать ваши текстовые данные в качестве аргументов 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) { }
)
Комментарии:
1. Спасибо, все работает нормально, однако дополнительные аргументы splitLayout здесь не учитываются, что можно проиллюстрировать изменением ширины ячейки на случайные проценты. Здесь это не так важно, но знаете ли вы, есть ли способ учесть параметры, чтобы добавить пространство между входами?
2. В моей системе работает нормально. Попробуйте, например
cellWidths = "5%"
.3. Например, если я использую один и тот же аргумент для всех элементов,
cellWidths = "5%"
это сработает, но если я попытаюсь использовать разную ширину для каждого блока, например,cellWidths = c("10%", "20%", "30%", "40%")
это не сработает, хотя это работало в моем нединамическом коде.cellArgs
Аргумент также не работает, хотя он работал в первый раз. Я предполагаю, что проблема заключается в том, как дополнительные аргументы должны быть переданыdo.call
функции, но я не смог найти способ заставить это работать.4. Извините — теперь я понимаю.
args
Список не был отформатирован должным образом (вложенный список). Пожалуйста, проверьте мою правку.