我正在构建一个闪亮的应用程序,它要求用户在本地计算机上选择一个文件夹,其中包含要由该应用程序处理的文件。
我正在使用这里提出的解决方案。这在本地计算机上可以正常工作,但是如果将应用程序部署到Shinyapps服务器上则无法正常工作。该解决方案的作者确认,该解决方案仅设计用于本地的Shiny应用程序,因为它进行OS Shell调用以显示目录对话框。
我想知道是否存在用于目录对话框的其他解决方案,该解决方案将在已部署的Shiny应用程序上正常工作(我正在部署到Shinyapps.io)。
编辑:请注意,由于以下两个原因,我无法使用fileInput接口:
multiple
启用了该选项,也无法一次选择所有文件。文件夹/文件结构不是我可以更改的东西,它是从医疗设备中按原样下载的,因此,我唯一希望用户指望的是指定父文件夹,其余应在R代码中完成。
这是一个基于使用“ webkitdirectory”属性的工作示例。目前,Chrome,Opera和Safari(移动和台式机)支持该属性,9月发布的Firefox 49应该支持该属性。在这里了解更多。它也可与子目录一起使用。
它需要在ui.R中使用tags关键字。我已经通过上传三个csv文件进行了测试,每个文件包含三个用逗号分隔的数字。在Chrome和Opera上进行了本地测试,并在Shinyapps.io上进行了测试。这是代码:
用户界面
library(shiny)
library(DT)
shinyUI(tagList(fluidPage(theme = "bootstrap.css",
includeScript("./www/text.js"),
titlePanel("Folder content upload"),
fluidRow(
column(4,
wellPanel(
tags$div(class="form-group shiny-input-container",
tags$div(tags$label("File input")),
tags$div(tags$label("Choose folder", class="btn btn-primary",
tags$input(id = "fileIn", webkitdirectory = TRUE, type = "file", style="display: none;", onchange="pressed()"))),
tags$label("No folder choosen", id = "noFile"),
tags$div(id="fileIn_progress", class="progress progress-striped active shiny-file-input-progress",
tags$div(class="progress-bar")
)
),
verbatimTextOutput("results")
)
),
column(8,
tabsetPanel(
tabPanel("Files table", dataTableOutput("tbl")),
tabPanel("Files list", dataTableOutput("tbl2"))
)
)
)
),
HTML("<script type='text/javascript' src='getFolders.js'></script>")
)
)
服务器
library(shiny)
library(ggplot2)
library(DT)
shinyServer(function(input, output, session) {
df <- reactive({
inFiles <- input$fileIn
df <- data.frame()
if (is.null(inFiles))
return(NULL)
for (i in seq_along(inFiles$datapath)) {
tmp <- read.csv(inFiles$datapath[i], header = FALSE)
df <- rbind(df, tmp)
}
df
})
output$tbl <- DT::renderDataTable(
df()
)
output$tbl2 <- DT::renderDataTable(
input$fileIn
)
output$results = renderPrint({
input$mydata
})
})
text.js
window.pressed = function(){
var a = document.getElementById('fileIn');
if(a.value === "")
{
noFile.innerHTML = "No folder choosen";
}
else
{
noFile.innerHTML = "";
}
};
getFolders.js
document.getElementById("fileIn").addEventListener("change", function(e) {
let files = e.target.files;
var arr = new Array(files.length*2);
for (let i=0; i<files.length; i++) {
//console.log(files[i].webkitRelativePath);
//console.log(files[i].name);
arr[i] = files[i].webkitRelativePath;
arr[i+files.length] = files[i].name;
}
Shiny.onInputChange("mydata", arr);
});
让我知道是否有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句