使用模块化的 Shiny 代码根据 selectInput 的值添加 fileInput 的数量

问题描述 投票:0回答:1

我迷失了,特别是对于使用现在不推荐的 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)
r shiny
1个回答
3
投票

您走在正确的道路上(

uiOutput
+
renderUI
)。这是一个代表。

dynamic number of fileinputs demo

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)
© www.soinside.com 2019 - 2024. All rights reserved.