运行 Javascript 在闪亮
Run Javascript in Shiny
我想 运行 服务器中的 JS(而不是 UI)。我知道我可以使用 运行js 函数通过 shinyjs 包来做到这一点,但我想知道如何通过本机 shiny 包来做到这一点。我尝试通过 session$sendCustomMessage()
和 Shiny.addCustomMessageHandler( )
但它不起作用。
我的尝试
library(shiny)
library(shinydashboard)
jscode <- "
window.close();
"
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
actionButton("close", "Close app"),
tags$script(
"Shiny.addCustomMessageHandler('closeWindow', function(data) {
data.message
});"
)
)
)
server = function(input, output, session) {
observeEvent(input$close, {
session$sendCustomMessage(type = "closeWindow", list(message = jscode))
})
}
runApp(list(ui = ui, server = server), launch.browser =T)
这适用于 shinyjs
library(shiny)
library(shinydashboard)
library(shinyjs)
jscode <- "
window.close();
"
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
shinyjs::useShinyjs(),
actionButton("close", "Close app")
)
)
server = function(input, output, session) {
observeEvent(input$close, {
runjs(jscode)
})
}
runApp(list(ui = ui, server = server), launch.browser =T)
您只是将 jscode 值作为字符串传递给 javascript 消息处理程序。您只能传递字符串或对象,而不能传递可执行代码。因此,为了实际 运行 代码,您需要 eval()
字符串。这应该有效
tags$script(
"Shiny.addCustomMessageHandler('closeWindow', function(data) {
eval(data.message)
});"
)
我想 运行 服务器中的 JS(而不是 UI)。我知道我可以使用 运行js 函数通过 shinyjs 包来做到这一点,但我想知道如何通过本机 shiny 包来做到这一点。我尝试通过 session$sendCustomMessage()
和 Shiny.addCustomMessageHandler( )
但它不起作用。
我的尝试
library(shiny)
library(shinydashboard)
jscode <- "
window.close();
"
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
actionButton("close", "Close app"),
tags$script(
"Shiny.addCustomMessageHandler('closeWindow', function(data) {
data.message
});"
)
)
)
server = function(input, output, session) {
observeEvent(input$close, {
session$sendCustomMessage(type = "closeWindow", list(message = jscode))
})
}
runApp(list(ui = ui, server = server), launch.browser =T)
这适用于 shinyjs
library(shiny)
library(shinydashboard)
library(shinyjs)
jscode <- "
window.close();
"
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
shinyjs::useShinyjs(),
actionButton("close", "Close app")
)
)
server = function(input, output, session) {
observeEvent(input$close, {
runjs(jscode)
})
}
runApp(list(ui = ui, server = server), launch.browser =T)
您只是将 jscode 值作为字符串传递给 javascript 消息处理程序。您只能传递字符串或对象,而不能传递可执行代码。因此,为了实际 运行 代码,您需要 eval()
字符串。这应该有效
tags$script(
"Shiny.addCustomMessageHandler('closeWindow', function(data) {
eval(data.message)
});"
)