我迷失了,特别是对于使用现在不推荐的 callModule() 的 Stack Overflow 问题的数量。我想我需要嵌套模块,其中有一个 ui 模块,其中包含 selectInput,它允许用户选择 fileInput 的数量。然后,selectInput 的值将被提供给 uiOutput,这会以某种方式在与 selectInput 相同的命名空间中创建 fileInput。在应用程序中,fileInputs 将直接出现在 selectInput 下方。这听起来好吗?
我尝试了一些文件输入没有显示的方法,但没有错误代码。尝试从下面开始:
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
outerUI <- function(id, multiple = FALSE){
ns <- NS(id)
fileTagList <- tagList(selectInput(ns("compare"), "Compare",
choices = 2:4, selected = 2))
## and something in here???
}
outerServer <- function(id) {
moduleServer(id, function(input, output, session) {
}
)
}
innerUI <- function(id, multiple = FALSE){
ns <- NS(id)
for(i in 1:input$ncompare){
fileTagList <- c(fileTagList,
tagList(tagList(fileInput(ns(paste0("pf",i)),
paste0("Input",i)))))
}
}
innerServer <- function(id) {
moduleServer(id, function(input, output, session) {
}
)
}
server <- function(input, output) {
outerServer("test")
}
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("tab1", tabName = "tab1")
)),
dashboardBody(
tabItem(tabName = "home",
outerUI("test")
)
)
)
shinyApp(ui, server)
您走在正确的道路上(
uiOutput
+ renderUI
)。这是一个代表。
library(shiny)
mod_inputs_ui <- \(id) {
ns <- NS(id)
tagList(
selectInput(
inputId = ns("selector"),
label = "How many file inputs?",
choices = 1:5
),
uiOutput(outputId = ns("file_inputs"))
)
}
mod_inputs_server <- \(id) {
moduleServer(
id = id,
module = \(input, output, session) {
ns <- session$ns
output$file_inputs <- renderUI({
req(input$selector)
lapply(seq_len(input$selector), \(i){
fileInput(
inputId = ns(paste0("file_input_", i)),
label = paste("File Input", i)
)
})
}) |> bindEvent(input$selector)
}
)
}
ui <- fluidPage(
tags$h1("Dynamic number of fileinputs"),
mod_inputs_ui("fileinputs")
)
server <- \(input, output, session) {
mod_inputs_server("fileinputs")
}
shinyApp(ui, server)