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 启发的解决方法。
- 我直接从here下载了Sweet Alert库的
sweetAlert.js
文件
- 我在 Shiny 应用程序的根目录中创建了一个
www
文件夹
我在 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)
})
通过以下代码,我可以通过单击文件输入的问号来触发纯 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 启发的解决方法。
- 我直接从here下载了Sweet Alert库的
sweetAlert.js
文件 - 我在 Shiny 应用程序的根目录中创建了一个
www
文件夹 我在
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"))
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)
})