web-dev-qa-db-ja.com

ブラウザウィンドウを閉じて、光沢のあるアプリの実行を停止する方法は?

shinyapps.ioにアプリをデプロイし、正常に動作しました。

アプリは5分間しか実行していませんが、メトリックを確認すると、約0.7時間の実行時間が表示されています。デフォルトのアイドル時間は15分ですが、5分(最小)に変更しました。また、光沢のあるアプリのブラウザーウィンドウを閉じた後でも、ダッシュボードでアプリが実行中と表示されていることに気付きました。

私は、ブラウザーウィンドウが閉じられてもアプリは実行を停止せず、アイドル時間の条件が満たされた場合にのみ停止することを想定しています。

ブラウザーウィンドウが閉じているときに光沢のあるアプリを停止する方法はありますか?この場合、次のコードが機能しますか?

session$onSessionEnded(function() {
    stopApp()
  })
17
Eka

私は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()
14
DoubleYou

私はこれを見つけました 優れたコード これは仕事をします。基本的には、次のようにします。

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を使用してブラウザウィンドウを閉じることは禁止されている場合があります。しかし、これは 別の議論 です。

6
untill

私はこの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))
2
Pork Chop