使用 Shiny fileInput 仅获取路径

dor*_*ran 5 r shiny

我有一个非常大的固定宽度文件,需要使用我的 Shiny 应用程序读取。我的程序目前的结构方式是 ui.R 包含一个 fileInput 允许用户使用浏览器定位文件。

在服务器端,我只捕获文件的路径,如下所示:

path2file <- reactive({
    infile <- input$path2file
    if (is.null(infile)) return(NULL)    
    infile$datapath  
}) 
Run Code Online (Sandbox Code Playgroud)

随后的函数将该路径作为输入,并根据其布局规范继续读入文件。这一切都很好;然而,当处理非常大的 fwf 文件时,我的程序会大大减慢,并且需要数小时才能使用 fileInput 读取文件的路径名

我怀疑 fileInput 实际上正在读取整个文件,然后我的函数只返回数据路径,即使我没有在函数中明确读取任何文件格式类型。

我的目标是继续使用我现在已经构建的程序,并使用我的 fileInput 仅获取该文件的路径。我在 SO 上找到了这个主题,并认为这是一个可能的选择。

使用浏览按钮从 Shiny UI(不仅仅是目录)获取文件路径而不上传文件

但是,我的目标是最小化我拥有的包依赖项的数量;这已经成为一个大问题,所以如果我必须使用额外的包,我会,但我想不惜一切代价避免这种情况。

我尝试了这个便宜的技巧:

path2file <- reactive({
    infile <- input$path2file
    if (is.null(infile)) return(NULL)    
    scan(infile$datapath, n = 1)
    infile$datapath  
}) 
Run Code Online (Sandbox Code Playgroud)

认为这将是一个快速的解决方法,但它也非常慢,所以我怀疑它也不是只读取 n = 1。所以,我的问题是任何人都可以确定一种使用 fileInput 来允许用户定位文件的方法并让服务器端功能仅捕获路径而不读取文件或尝试以任何方式解析它?更重要的是,这是否可以单独使用 base R 和 Shiny 中的函数来完成,而不必从其他扩展包中获取函数?

以上是server.R文件中相关代码部分,ui.R文件中相关代码部分是

fileInput('path2dor', 'Choose the DOR .txt file to format',
        accept=c('text/csv', 
        'text/comma-separated-values,text/plain', '.csv')), 
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议。

小智 2

无法使用此功能fileInput。原因是出于安全原因“fileInput”不向服务器提供本地路径信息。当fileInput用户通过本地计算机上的浏览器进行导航时,服务器端生成的文件是所选本地一次的上传副本。

作为替代方案,您可以使用该shinyFiles包,它可以在服务器端进行导航。这意味着您将获得本地计算机上的所有路径。

第二种选择可能是简单的文本输入,它允许用户手动添加路径(确保检查服务器端的路径以免遇到任何麻烦)。