指定从 R Shiny 应用程序下载的目标文件夹

Specify destination folder for download from an R Shiny app

我正在开发一个闪亮的应用程序,用户可以在其中上传文件,然后处理该文件以生成报告,用户可以将其下载为可编辑的 Word .doc。

它按预期工作,除了出现“另存为”对话框 window 似乎允许您选择目标目录之外,生成的 .doc 文件最终被保存到一个临时目录使用随机生成的名称(在 Windows 下)。

我怀疑这是由于使用了 tempdir 命令,它是使用 rmarkdown 生成下载文件的一部分。

应如何修改以下代码以允许选择目标文件夹?

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)
library(knitr)

# Define UI for application that draws a histogram
ui <- fluidPage(
  uiOutput('markdown'),
    # Application title
    titlePanel("Apptitle"),

    # Sidebar with file input
    sidebarLayout(
        sidebarPanel(
          fileInput(
            inputId = "file1",
            label = "Select file(s)",
            multiple = TRUE,
            accept = NULL,
            width = NULL,
            buttonLabel = "Browse...",
            placeholder = "No file(s) selected"
          ),
        downloadButton("report", "Generate report")
        ),
    )
)

server <- function(input, output) {
      
        output$report <- downloadHandler(
          reactive(file <- input$file1),
          filename = "wordreport.doc",
          content = function(file) {
            tempReport <- file.path(tempdir(), "wordreport.Rmd")
            file.copy("wordreport.Rmd", tempReport, overwrite = TRUE)
            params <- list(report.data = input$file1)
            rmarkdown::render(tempReport, output_file = "wordreport.doc",
                              params = params,
                              envir = new.env(parent = globalenv()))
    })
}

shinyApp(ui = ui, server = server)

感谢您的帮助!

编辑:已修复,使用以下解决方案,此处建议编辑代码:

您将 reactive(file <- input$file1) 作为 contentType 参数传递给 downloadHandler(),这不太好。此外,您没有向作为 content 函数的参数给出的 file 写入任何内容。

删除 reactive(file <- input$file1) 行,并在 rmarkdown::render() 中指定 output_file = file,您的下载应该可以进行。

正如评论中所讨论的,您将无法控制下载路径——这是用户的网络浏览器及其设置将决定的。

这里有一个更精简的应用程序,可以下载功能文件,供参考:

library(shiny)

ui <- fluidPage(
  sliderInput("value", "Some value", 1, 5, 2),
  downloadButton("report", "Generate report")
)

server <- function(input, output) {
  output$report <- downloadHandler(
    filename = "wordreport.doc",
    content = function(file) {
      params <- list(value = input$value)
      rmarkdown::render(
        system.file("examples/knitr-minimal.Rmd", package = "knitr"),
        output_file = file,
        params = params,
        envir = new.env(parent = globalenv())
      )
    }
  )
}

shinyApp(ui, server)