在Shiny应用程序中下载带有输入文件名的文件

时间:2018-12-19 13:23:33

标签: r shiny

我的目标是使下载响应文件名文本字段中的更改。使用以下解决方案时,从第一个文件名输入开始,下载文件的名称便不会更改。

示例:

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=",")
      }
    )

然后按预期工作。我需要做些什么来保持单独的功能?

1 个答案:

答案 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)
  })
}