R Shiny:在服务器端使用 Actionbutton 的 Onclick 选项

R Shiny: Use Onclick Option of Actionbutton on the Server Side

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

假设文件是​​ test.txt(在我的例子中,它将是各种 R、Excel 和 exe 文件,它们将从驱动器上的不同文件夹复制到 www 文件夹) .

我的第一次尝试是使用带有 onclick 选项的 actionbutton,如下所示

    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 操作是在评估 observevent 之前完成的。

然后我尝试在 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 App 时创建的,而不是在用户单击操作按钮时创建文件。如果我在一个文件比较大的应用程序中多次使用这段代码,这是非常低效的。

也许可以确保observevent 在onclick-action 之前执行,或者在服务器端使用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)