我想制作一个闪亮的应用程序,用户可以在其中按下操作按钮,然后触发服务器端的一些代码,在 www 文件夹中创建一个文件,然后打开/下载该文件。
假设该文件是 test.txt(在我的例子中,它将是各种 R、Excel 和 exe 文件,这些文件将从驱动器上的不同文件夹复制到 www 文件夹)。
我的第一次尝试是使用带有 onclick 选项的操作按钮,如下所示
ui <- fluidPage(
actionButton("showtxt", "Show/Download File", onclick = "window.open('test.txt')")
)
server <- function(input, output, session){
observeEvent(input$showtxt,{
# Write some text
write.table(c("Test"), file = "www/test.txt")
})
}
shinyApp(ui=ui,server=server)
但这不起作用,因为 onclick 操作是在观察事件评估之前完成的。
然后我尝试调用 onclick 选项内部的函数,如下所示
CreateFileAndLink <- function(){
write.table(c("Test"), file = "www/test.txt")
return("window.open('test.txt')")
}
ui <- fluidPage(
actionButton("showtxt", "Show/Download File", onclick = CreateFileAndLink())
)
server <- function(input, output, session){}
shinyApp(ui=ui,server=server)
这种方法可行,但有一个缺点,即现在在打开 Shiny 应用程序时创建文件,而不是在用户单击操作按钮时创建文件。如果我要在一个文件较大的应用程序中多次使用这段代码,这是非常低效的。
也许可以确保observeevent在onclick-action之前执行,或者可以在服务器端使用onclick选项。
任何帮助将不胜感激!
Cheers
UPDATE:
我发现伟大的shinyjsDean Attali 的软件包包含一个 onclick 函数,可能会有所帮助。我尝试运行下面的代码,但没有成功:/
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
actionButton("showtxt", "Show/Download File")
)
server <- function(input, output, session){
observeEvent(input$showtxt,{
# Write some text
write.table(c("Test"), file = "www/test.txt")
# Call Onclick
onclick("showtxt", "window.open('test.txt')")
})
}
shinyApp(ui=ui,server=server)