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

Posted

技术标签:

【中文标题】在 R 闪亮的模块中使用 actionButton + insertUI 创建多个输入【英文标题】:using actionButton + insertUI in R shiny modules to create multiple inputs 【发布时间】:2021-11-06 15:26:13 【问题描述】:

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

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

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

非常感谢任何以正确方式执行此操作的帮助!

模块代码:

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。 对于模块 UI 中的 id,您必须使用命名空间 NS。 对于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是文件位置。在我的代码中,我只是打印出来,你可以做其他事情。

【讨论】:

以上是关于在 R 闪亮的模块中使用 actionButton + insertUI 创建多个输入的主要内容,如果未能解决你的问题,请参考以下文章

观察事件中的R闪亮updateSelectInput不起作用

R闪亮仪表板中标题中的主页按钮

如何使用 actionButton 更改 R Shiny 中 selectInput 上的选定值?

R Shiny:在服务器端使用 Actionbutton 的 Onclick 选项

在按下actionButton后在表格中添加行时,删除行在闪亮的应用程序中不起作用

选择一个 DT 行,然后在闪亮的应用程序中根据小部件选择输入和 actionButton() 更改该行的一个单元格的值