运行 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)
      });"
    )