单击导航栏上的关闭(Chrome)浏览器窗口

Vin*_*ent 1 r shiny

我一直在使用@wch在SO上建议的方法在点击Shiny应用程序中的操作按钮时关闭浏览器窗口.效果很好.

我现在想要在单击导航栏中的元素时停止我的应用关闭bowser窗口(在Chrome中).在我正在使用的tabPanel调用下面

tabPanel(title = "", value = "Stop", icon = icon("power-off"))
Run Code Online (Sandbox Code Playgroud)

我使用观察者来停止应用程序的值input$navbar == "Stop"(即,当选择导航栏中的图标时),但我不知道如何激活window.close()呼叫.

用于关闭浏览器窗口的操作代码按钮@wch

tags$button(
  id = 'close',
  type = "button",
  class = "btn action-button",
  onclick = "window.close();",
  "Close window"
)
Run Code Online (Sandbox Code Playgroud)

编辑:

找到了一个可以满足我想要的解决方案.

tabPanel(tags$a(id = "quitApp", href = "#", class = "action-button",
         list(icon("power-off"), ""), onclick = "window.close();"))
Run Code Online (Sandbox Code Playgroud)

不幸的是,它导致了一个相当糟糕的导航栏.我问了Shiny google小组的一个相关问题

严重对齐的导航栏

Dea*_*ali 6

您可以使用shinyjs包轻松调用javascript函数,这基本上就是您需要做的.免责声明:我写了那个包.这是执行您想要的代码:

library(shinyjs)
jscode <- "shinyjs.closewindow = function() { window.close(); }"

runApp(shinyApp(
  ui = tagList(
    useShinyjs(),
    extendShinyjs(text = jscode),
    navbarPage(
      "test",
      id = "navbar",
      tabPanel(title = "tab1"),
      tabPanel(title = "", value = "Stop", icon = icon("power-off"))
    )
  ),
  server = function(input, output, session) {
    observe({
      if (input$navbar == "Stop") {
        js$closewindow();
        stopApp()
      }
    })
  }
))
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你不想使用JS包,你可以使用本机闪亮做同样的事情:

jscode <- "Shiny.addCustomMessageHandler('closeWindow', function(m) {window.close();});"

runApp(shinyApp(
  ui = tagList(
    tags$head(tags$script(HTML(jscode))),
    navbarPage(
      "test",
      id = "navbar",
      tabPanel(title = "tab1"),
      tabPanel(title = "", value = "Stop", icon = icon("power-off"))
    )
  ),
  server = function(input, output, session) {
    observe({
      if (input$navbar == "Stop") {
        session$sendCustomMessage(type = "closeWindow", message = "message")
        stopApp()
      }
    })
  }
))
Run Code Online (Sandbox Code Playgroud)