我正在制作一些简单闪亮的应用程序,它允许用户下载R生成的csv文件,但在使用闪亮的下载按钮时遇到一些困难
这是我的代码示例 在UI方面,
body <- dashboardBody(
tabItem("output1",
fluidRow(
infoBox(title = "Download Output File", color = "lime", fill = TRUE, icon = icon("cloud-download"), width = 6, uiOutput(outputId = "downloadAction")
)
)
)
) )
在服务器端, 我的计算返回状态为false或true的列表,并且数据框也需要放入下载文件
server <- function(input, output) {
calculation <- reactive({...})
output$downloadAction <- renderUI({
cal <- calculation()
if (!cal$status) return()
downloadButton(outputId = "downloadFiles", label = "Download Available")
})
output$downloadFiles <- downloadHandler(
filename = function() {
# Create download data file
filename <- paste0("data-", Sys.Date(), "-", floor(runif(1, 1, 10000)), ".csv")
while (file.exists(filename)) {
filename <- paste0("data-", Sys.Date(), "-", floor(runif(1, 1, 10000)), ".csv")
}
},
content = function(file) {
write.csv(calculation()$data, file)
}
)
}
但这会导致错误消息“ERROR:replacement has length zero” 我知道这是因为一些空值被发送到R期望非空值,但不知道根本原因是什么以及如何解决它。 谢谢你的建议
#我想我弄明白了这个问题 在文件名功能中,您不能将字符串分配给变量
filename = function() {
# Create download data file
filename <- paste0("data-", Sys.Date(), "-", floor(runif(1, 1, 10000)), ".csv")
while (file.exists(filename)) {
filename <- paste0("data-", Sys.Date(), "-", floor(runif(1, 1, 10000)), ".csv")
}
},
content = function(file) {
write.csv(calculation()$data, file)
}
)
我改为
filename = function() {
# Create download data file
paste0("data-", Sys.Date(), "-", floor(runif(1, 1, 10000)), ".csv")
},
content = function(file) {
write.csv(calculation()$data, file)
}
现在有效。我猜Shiny应该能够处理文件名冲突,因为它总是创建临时文件名,所以不需要在代码中检测文件名冲突?