指定从 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)
我正在开发一个闪亮的应用程序,用户可以在其中上传文件,然后处理该文件以生成报告,用户可以将其下载为可编辑的 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)