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

Posted

技术标签:

【中文标题】R Shiny:在服务器端使用 Actionbutton 的 Onclick 选项【英文标题】:R Shiny: Use Onclick Option of Actionbutton on the Server Side 【发布时间】:2018-02-03 10:43:57 【问题描述】:

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

假设该文件是 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 操作是在评估观察事件之前完成的。

然后我尝试在 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)

【问题讨论】:

你问的是downloadButton吗? link 我知道它是如何工作的,但我喜欢浏览器尝试打开文件的方式(例如,如果它是 .txt 或 .pdf 文件)。我找到了一个使用 onclick 函数的解决方案,该函数将在下面发布作为答案(当 *** 让我这样做时)。但感谢您的评论。 :-) 【参考方案1】:

我找到了一个使用 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) 

【讨论】:

以上是关于R Shiny:在服务器端使用 Actionbutton 的 Onclick 选项的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 R Shiny 中的单选按钮显示输出?

R----Shiny包介绍学习

在我选择并删除一个条目之前,R Shiny 中的 selectizeInput() 不允许输入

通过 Shiny Server 将 Shiny 输入传递给 R markdown

RStudio 服务器 Shiny 上的 R Shiny dev 应用程序启动时崩溃

「R」Shiny:响应式编程server 函数