在 Shiny 中运行 Javascript

Ujj*_*ari 4 r shiny shinyjs

我想在服务器中运行 JS(而不是 UI)。我知道我可以使用 runjs 函数通过闪亮js 包来做到这一点,但我想知道如何通过本机闪亮包来做到这一点。我尝试通过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)
Run Code Online (Sandbox Code Playgroud)

这适用于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)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

您只需将 jscode 值作为字符串传递给您的 javascript 消息处理程序。您只能传递字符串或对象,而不能传递可执行代码。因此,为了实际运行代码,您需要该eval()字符串。这应该有效

    tags$script(
      "Shiny.addCustomMessageHandler('closeWindow', function(data) {
       eval(data.message)
      });"
    )
Run Code Online (Sandbox Code Playgroud)