在 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()
您需要修复一些错误:
- 要使用模块,您必须同时拥有 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
是文件位置。在我的代码中,我只是打印出来,你可以做其他事情。
我创建了一个模块来帮助我接受 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()
您需要修复一些错误:
- 要使用模块,您必须同时拥有 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
是文件位置。在我的代码中,我只是打印出来,你可以做其他事情。