Как остановить запуск блестящего приложения, закрыв окно браузера?
Я развернул приложение в shinyapps.io и оно работает нормально.
Я запускаю приложение всего 5 минут, но когда я проверил метрики, оно показывает время работы около 0,7 часов. Я обнаружил, что по умолчанию установлено время простоя 15 минут, которое я изменил на 5 минут (минимум). Я также заметил, что даже после закрытия окна браузера блестящего приложения оно все еще показывает, что приложение работает на моей панели инструментов.
Я предполагаю, что приложение не прекращает работу при закрытии окна браузера и останавливается только при выполнении условия простоя.
Есть ли способ остановить блестящее приложение, когда окно браузера закрыто? Будет ли работать следующий фрагмент кода в этом случае?
session$onSessionEnded(function() {
stopApp()
})
Ответы
Ответ 1
Я не знаю shinyapps.io, но в R (как показывает ваш тег) вы действительно можете остановить shinyApp
через onSessionEnded
. Ниже приведен минимальный рабочий пример.
rm(list=ls())
library(shiny)
doshiny <- function() {
app=shinyApp(
ui = fluidPage(
textInput("textfield", "Insert some text", value = "SomeText")
),
server = function(input, output, session) {
session$onSessionEnded(function() {
stopApp()
})
}
)
runApp(app)
}
openshiny <- function() {
doshiny()
print("Finished.")
}
openshiny()
Ответ 2
Я нашел этот отличный код, который делает эту работу. По сути, вам так нравится:
library(shiny)
library(shinyjs)
jscode <- "shinyjs.closeWindow = function() { window.close(); }"
ui <- fluidPage(
useShinyjs(),
extendShinyjs(text = jscode, functions = c("closeWindow")),
actionButton("close", "Close window")
)
server <- function(input, output, session) {
observeEvent(input$close, {
js$closeWindow()
stopApp()
})
}
shinyApp(ui, server)
Обратите внимание, что закрытие окна браузера с помощью JavaScript может быть запрещено. Но это другое обсуждение.
Ответ 3
Я добавил этот код inactivity
JS, чтобы помочь мне с некоторыми из моих блестящих приложений, которые IDLE. Код в значительной степени говорит само за себя, где я отслеживаю движения мыши и щелчки. Обратите внимание, что это приложение закроется через 5 секунд.
library(shiny)
library(leaflet)
inactivity <- "function idleTimer() {
var t = setTimeout(logout, 5000);
window.onmousemove = resetTimer; // catches mouse movements
window.onmousedown = resetTimer; // catches mouse movements
window.onclick = resetTimer; // catches mouse clicks
window.onscroll = resetTimer; // catches scrolling
window.onkeypress = resetTimer; //catches keyboard actions
function logout() {
window.close(); //close the window
}
function resetTimer() {
clearTimeout(t);
t = setTimeout(logout, 5000); // time is in milliseconds (1000 is 1 second)
}
}
idleTimer();"
ui <- fluidPage(
tags$script(inactivity),
actionButton("recalc","recalc"),
leafletOutput("mymap")
)
server <- shinyServer(function(input,output,session){
points <- eventReactive(input$recalc, {
cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
}, ignoreNULL = FALSE)
output$mymap <- renderLeaflet({
leaflet() %>%
addProviderTiles(providers$Stamen.TonerLite,options = providerTileOptions(noWrap = TRUE)) %>%
addMarkers(data = points())
})
})
runApp(list(ui = ui, server = server))