R Shiny - 使用 javascript 直接从 UI 触发 shinyalert 弹出窗口

R Shiny - Trigger a shinyalert popup directly from the UI using javascript

通过以下代码,我可以通过单击文件输入的问号来触发纯 javascript alert

            fileInput('peptides', 
                      span("Peptides file  ",
                           id="peptidesSpan",
                           tags$a(
                             tags$i(class='fa fa-question-circle'),
                             href = "#",
                             onclick = "alert('Oops!'); return false;")
                      ),
                      multiple=FALSE,
                      accept = c('text/csv','text/comma-separated-values',
                      )
            )

我想知道我是否可以触发一个 shinyalert 弹出窗口 (https://github.com/daattali/shinyalert/) 而不是一个简单的 javascript 警报直接形成 UI 而服务器中没有任何观察者边。

类似于:

shinyalert("Oops!", "Something went wrong.", type = "error")

如果没有解决方法,也欢迎与观察员提出任何其他建议。

这是我自己回答的少数几次之一 post,但在对堆栈溢出进行更多搜索后,我发现了一个受 this post 启发的解决方法。

  1. 我直接从here下载了Sweet Alert库的sweetAlert.js文件
  2. 我在 Shiny 应用程序的根目录中创建了一个 www 文件夹
  3. 我在 www 目录中添加了 sweetAlert.js 文件,在 ui.R 的 dashboardBody() 中添加了以下行:

    tags$head(tags$script(src="sweetAlert.js"))

现在我可以使用任何参数直接调用 Swal.fire 函数,就像我通常在运行 javascript.

的任何其他框架中所做的那样

我认为使用观察者一点也不不方便。

而不是 alert(),调用 Shiny.setInputValue(id, value);,然后在您的服务器端您可以 observeEvent(input[id], { shinyalert() })

阅读这篇文章了解详情:https://shiny.rstudio.com/articles/communicating-with-js.html

您只需使用一个观察代码块即可实现。

一个例子

在您的 UI Javascript 代码中定义一个自定义函数并在您的 onclick 中调用它。 你可以把这个函数放在项目文件夹的 'www' 文件夹中的 helper.js 中,即 www/helper.js。通过 tags$head(tags$script(src = "helper.js"))

将此文件包含在您的闪亮 UI 代码中
function showAlert(message, type = "info") {
  Shiny.setInputValue(
    'alertMessage',
    {
      message: message,
      type: type
    },
    { priority: 'event' }
  );
}

然后在Shiny服务端定义一次观察者

observeEvent(input$alertMessage, {
  alertData <- input$alertMessage
  req(alertData)

  shinyalert("title", alertData$message, type = alertData$type)
})