首页 > 解决方案 > R Shiny - 使用 javascript 直接从 UI 触发闪亮警报弹出窗口

问题描述

使用以下代码,我可以alert通过单击 fileInput 的问号来触发纯 javascript:

在此处输入图像描述

            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/)而不是直接形成 UI 的简单 javascript 警报,而服务器端没有任何观察者。

就像是:

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

如果没有解决方法可以做到这一点,那么也欢迎观察者提出任何其他建议。

标签: rshinyshinyalert

解决方案


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

而不是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. 将此文件包含在您的 Shiny UI 代码中tags$head(tags$script(src = "helper.js"))

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)
})


推荐阅读