在 R 闪亮模块中使用 actionButton + insertUI 创建多个输入

using actionButton + insertUI in R shiny modules to create multiple inputs

我创建了一个模块来帮助我接受 1) excel 文件 2) sheet 名称的文本输入和 3) 范围的文本输入。

我希望能够在应用程序中使用此模块,以便每次单击操作按钮(下面代码中的 AddExcelDataButton)时,它允许我输入不同的文件。我还需要能够稍后提取文件的内容。

我在主应用程序中尝试了以下代码,但它抛出了以下错误 error1:UI 正在链接“按钮内”的所有输入 error2:我无法弄清楚如何在代码中稍后“访问”或检索文件名。

非常感谢您以正确的方式完成这项工作的任何帮助!

模块代码:

importExceldataUI <- function(importExceldata){
  tagList(
    
    tags$div(
      HTML(paste0("<b>", "Enter Your Data Here"))
    ),
    
    tags$div(
    fileInput(inputId = "ImportExcelFile",
              label = "Excel File",
              multiple=FALSE),
    style = "display:inline-block; vertical-align:top"
    ),# end of tags$div for fileInput ImportExcelFile
    
    tags$div(
    textInput(inputId = "ExcelSheetName",
              label = "Sheet",
              value="Data",),
    style = "display:inline-block; vertical-align:top"
     ),#end of tags$Div for texinput-ExcelSheetName
    
    tags$div(
    textInput(inputId = "ExcelSheetRange",
              label = "Range",
              value = "C5:BN1000"),
    style = "display:inline-block"
    )#end of tags$div for textInput - sheetrange
 )
}


importExceldataServer <- function(importExceldata){
  moduleServer(importExceldata, function(input, output, session){
 })  
}

主应用代码

importExceldataApp <- function(){
  ui <- fluidPage(
    mainPanel(
     actionButton(inputId = "AddExcelDataButton", label = "Click here to add Excel Data"),
     
  )#emd pf mainpanel
  )
  
  server <- function(input, output, session){
       observeEvent(input$AddExcelDataButton, {
        insertUI(selector = "#AddExcelDataButton",
                 ui = importExceldataUI(paste0("file",input$AddExcelDataButton))) 
       })#end of observeEvent
    
  }
  
  shinyApp(ui, server)
}


importExceldataApp()

您需要修复一些错误:

  1. 要使用模块,您必须同时拥有 UI 和服务器的 ID。对于每一对,它们必须具有相同的 ID。
  2. 对于模块 UI 中的 ID,您必须使用命名空间 NS
  3. 对于insertUI,默认是插入到选择器中,显然,你不想插入到按钮里面,你需要在按钮之后添加,所以你需要有where参数, 请阅读该功能的帮助文件

您应该阅读更多有关 shiny modules standards

的内容

这是工作代码:

library(shiny)

importExceldataUI <- function(id){
    ns <- NS(id)
    tagList(
        tags$div(
            HTML(paste0("<b>", "Enter Your Data Here"))
        ),
        tags$div(
            fileInput(inputId = ns("ImportExcelFile"),
                      label = "Excel File",
                      multiple=FALSE),
            style = "display:inline-block; vertical-align:top"
        ),# end of tags$div for fileInput ImportExcelFile
        
        tags$div(
            textInput(inputId = ns("ExcelSheetName"),
                      label = "Sheet",
                      value="Data"),
            style = "display:inline-block; vertical-align:top"
        ),#end of tags$Div for texinput-ExcelSheetName
        
        tags$div(
            textInput(inputId = ns("ExcelSheetRange"),
                      label = "Range",
                      value = "C5:BN1000"),
            style = "display:inline-block"
        )#end of tags$div for textInput - sheetrange
    )
}


importExceldataServer <- function(id){
    moduleServer(id, function(input, output, session){
        observeEvent(input$ImportExcelFile, {
            req(input$ImportExcelFile)
            print(input$ImportExcelFile$datapath)
        })
    })  
}

importExceldataApp <- function(){
    ui <- fluidPage(
        mainPanel(
            actionButton(inputId = "AddExcelDataButton", label = "Click here to add Excel Data"),
        )#emd pf mainpanel
    )
    
    server <- function(input, output, session){
        observeEvent(input$AddExcelDataButton, {
            insertUI(selector = "#AddExcelDataButton", where = "afterEnd",
                     ui = importExceldataUI(paste0("file",input$AddExcelDataButton))) 
            importExceldataServer(paste0("file",input$AddExcelDataButton))
        })#end of observeEvent
        
    }
    
    shinyApp(ui, server)
}


importExceldataApp()

所以要读取上传文件的路径,只需使用input$ImportExcelFile$datapathdatapath是文件位置。在我的代码中,我只是打印出来,你可以做其他事情。