R 闪亮:使用服务器端操作按钮的单击选项



我想制作一个闪亮的应用程序,用户可以在其中按下一个动作按钮,然后在服务器端触发一些代码,在www文件夹中创建一个文件,然后打开/下载文件。

假设文件是测试的.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 应用程序时创建的,而不是在用户单击操作按钮时创建文件。如果我在文件相对较大的应用程序中多次使用这段代码,这是非常低效的。

也许可以确保在onclick-action之前执行observevent,或者可以在服务器端使用onclick选项。

任何帮助将不胜感激!

干杯

更新:

我发现Dean Attali的很棒的shinyjs软件包包含一个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)

我使用shinyjs包中的 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", runjs("window.open('test.txt')"))
}

shinyApp(ui=ui,server=server) 

最新更新