在 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$datapath
,datapath
是文件位置。在我的代码中,我只是打印出来,你可以做其他事情。
【讨论】:
以上是关于在 R 闪亮的模块中使用 actionButton + insertUI 创建多个输入的主要内容,如果未能解决你的问题,请参考以下文章
观察事件中的R闪亮updateSelectInput不起作用
如何使用 actionButton 更改 R Shiny 中 selectInput 上的选定值?
R Shiny:在服务器端使用 Actionbutton 的 Onclick 选项