通过闪亮服务器中的接收器功能保存文件?

Save a file via sink function in shiny server?

我有一个闪亮的应用程序可以生成 .txt 文件供下载。 此外,我想保留用户在我闪亮的服务器中生成的文件的副本。 服务器函数看起来像:

server <- function(input, output, session){

data_gen <- reactive({

d1= data.frame(...)
d2= data.frame(...)

result <- list(d1=d1, d2=d2) 
return(result)

})

create_file <- reactive({
 sink("/srv/shiny-server/S3/file.txt",append = TRUE)
 print(data_gen()$d1) 
 print(data_gen()$d2)
 sink()

})

output$downloadData <- downloadHandler(

  filename = function() {"input.txt"},
  content = function(file) {

      sink(file,append = TRUE)

    print(data_gen()$d1) 
    print(data_gen()$d2)

      sink()
  }
)


}

我可以下载数据,但应用程序对 create_file 功能没有反应,也没有将副本写入闪亮的服务器。 知道我该如何解决这个问题吗?

您的 create_file 功能是被动的。反应函数仅在 1) 需要它们的输出,以及 2) 它们的输入发生变化时才进行评估。两者似乎都不适用于此处。

您可以将 create_file 的内容移动到您的下载处理程序中。 content 必须接收一个函数,即 returns 一个文件,但是函数可以先做其他事情。所以请尝试以下操作:

server <- function(input, output, session){

    data_gen <- reactive({
        d1= data.frame(...)
        d2= data.frame(...)
        result <- list(d1=d1, d2=d2) 
        return(result)
    })

    output$downloadData <- downloadHandler(

        filename = function() {"input.txt"},
        content = function(file) {

        # save non-user copy
        sink("/srv/shiny-server/S3/file.txt",append = TRUE)
        print(data_gen()$d1) 
        print(data_gen()$d2)
        sink()

        # copy to be returned for user
        sink(file,append = TRUE)
        print(data_gen()$d1) 
        print(data_gen()$d2)
        sink()
    })
}