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

时间:2018-10-17 15:41:23

标签: r download shiny save sink

我有一个闪亮的应用程序,可以生成一个.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功能,并且不会将副本写入闪亮的服务器。 知道我该如何解决吗?

1 个答案:

答案 0 :(得分:2)

您的create_file函数是反应式的。无功函数仅在以下情况下评估:1)需要其输出,以及2)其输入已更改。似乎都不适用于这里。

您可以做的是将create_file的内容移到下载处理程序中。 content必须接收一个返回文件的函数,但是该函数可以首先执行其他操作。因此,请尝试以下操作:

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()
    })
}