会话后在R Shiny中修改和读取全局变量

时间:2019-07-05 11:39:27

标签: r shiny

我正在尝试读取在UI之前声明的全局变量。在一种情况下,我正在会话期间和观察者函数中修改全局变量。但是,当我想在会话终止后打印修改后的变量时,它会自己打印旧值。我想为每个会话保留修改后的变量(每次更改时,在我的要求下)。

library(shiny)    

timeoutSeconds <- 5
varA <- 3 #Declaring Global variable    

#Trigger the function after the 5 seconds 
inactivity <- sprintf("
function idleTimer() {
var t = setTimeout(logout, %s);
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() {
   Shiny.setInputValue('timeOut', '%ss')
  }

function resetTimer() {
   clearTimeout(t);
   t = setTimeout(logout, %s);  // time is in milliseconds (1000 is 1 second)
   }
}
idleTimer();", 
timeoutSeconds*1000, 
timeoutSeconds, 
timeoutSeconds*1000)

#UI 
ui <- fluidPage(
  tags$script(inactivity)  

)

#Server
server <- shinyServer(function(input,output,session){


  observeEvent(input$timeOut, {
    varA <-varA + 1 #Modifing this global variable for each session

    print(paste0("Session (", session$token, ") timed out at: ", Sys.time()))
    showModal(modalDialog(
      title = "Timeout",
      paste("Session timeout due to", input$timeOut, "inactivity -", Sys.time()),
      footer = NULL
    ))
    session$close()
  })

  session$onSessionEnded(function() {

    #Should print 4
    print(varA) #Printing the modified  variable  during sessions

  })

})

runApp(ui,server)

我想在上面的代码中打印4。我已经尝试了多次,但可能无法正常工作。你能帮我吗?

2 个答案:

答案 0 :(得分:0)

print(varA)observeEvent函数外部,因此它将打印varA的初始值(即3)而不是更新后的值(4)。解决方案是在print(varA)函数中将session$close()放在observeEvent下方。

这意味着您可以删除(现在为空)session$onSessionEnded(function() { })函数。

答案 1 :(得分:0)

尝试一下:

varA <<-varA + 1

更改全局变量