我的目标是使下载响应文件名文本字段中的更改。使用以下解决方案时,从第一个文件名输入开始,下载文件的名称便不会更改。
示例:
library("shiny")
ui <- fluidPage(
fluidRow(
column(1, offset=1,
downloadButton(outputId="save",
label="Save")
),
column(2, offset=1,
textInput(inputId="name",
label="Filename:")
)
)
)
server <- function(input, output, session) {
observe({
data <- data.frame(x=1:50, y=rnorm(50))
serverDownloadCSV <- function(name, data) {
dl <- downloadHandler(
filename=function() {
if (name == "") {
paste("Untitled", "csv", sep=".")
} else {
paste(name, "csv", sep=".")
}
},
content = function(file) {
write.table(data, file, row.names=FALSE, append=TRUE, sep=",")
}
)
return(dl)
}
output$save <- serverDownloadCSV(name=input$name, data=data)
})
}
runApp(appDir=list(ui=ui, server=server), launch.browser=TRUE)
但是,如果我没有downloadHandler
作为单独的函数,但格式如下:
output$save <- downloadHandler(
filename=function() {
if (input$name == "") {
paste("Untitled", "csv", sep=".")
} else {
paste(input$name, "csv", sep=".")
}
},
content = function(file) {
write.table(data(), file, row.names=FALSE, append=TRUE, sep=",")
}
)
然后按预期工作。我需要做些什么来保持单独的功能?
答案 0 :(得分:1)
在input$name
的开头拨打电话observe
。尽管append=TRUE
不起作用,但应该这样做,因为它将始终创建一个新文件,而不是追加到现有的csv文件中。
这是新的server.R
代码:
server <- function(input, output, session) {
observe({
input$name
data <- data.frame(x=1:50, y=rnorm(50))
serverDownloadCSV <- function(name, data) {
downloadHandler(
filename=function() {
if (name == "") {
paste("Untitled", "csv", sep=".")
} else {
paste(name, "csv", sep=".")
}
},
content = function(file) {
write.table(data, file, row.names=FALSE, append=TRUE, sep=",")
}
)
}
output$save <- serverDownloadCSV(name=input$name, data=data)
})
}