2015-07-13 154 views
1

单击Shiny应用程序中的操作按钮时,我一直在使用suggested by @wch on SO关闭浏览器窗口的方法。很棒。关闭导航栏上的Chrome浏览器窗口单击

我现在想要停止我的应用程序单击导航栏中的某个元素时关闭浏览器窗口(在Chrome中)。下面的TabPanel呼叫我使用

tabPanel(title = "", value = "Stop", icon = icon("power-off")) 

我用一个观察者停止应用程序时的input$navbar == "Stop"值(也就是,当选择了导航栏的图标),但我不知道如何激活致电window.close()

规范操作按钮通过@wch

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

编辑关闭浏览器窗口:

找到一个解决的是我想要做什么。

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

不幸的是,它导致了一个相当糟糕的导航栏。我对谷歌闪亮组问related question

badly aligned navbar

+0

你能否提供更多的代码让我有一个完全可重复的闪亮的应用程序 –

+0

任何错误/不足与我提供的答案? –

+0

@daattali我喜欢答案,所以我投了票。不过,我更喜欢一个不需要包依赖的选项。然而,这可能不可行。 – Vincent

回答

5

可以使用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() 
     } 
    }) 
    } 
)) 

编辑

如果你不想使用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() 
     } 
    }) 
    } 
)) 
+0

不错的建议@daattali。我会试试看。 – Vincent