2015-11-11 34 views
0

我宣佈在R Shiny代碼:爲什麼Shiny reactiveValues()不會按預期更改?

################# Security Login, part of server.R in R Shiny App 
USER <- reactiveValues() 
USER$Logged <- FALSE 

## Some logic for login which changes USER$Logged to TRUE, eg. USER$Logged <- TRUE, this works well in changing to TRUE 

## Logout handler fails because it can change to FALSE, but then resets back to TRUE 
logoutHandler <- observeEvent(input$Logout, 
    USER$Logged <- FALSE 
} 

#This is the trace result. The number 1 or 0 is the value of input$Logout 
#"USER$Logged: FALSE 1" 
#"USER$Logged outside Handler: FALSE 1" 
#"USER$Logged outside Handler: TRUE 1" #Proof of reset 
#"USER$Logged outside Handler: TRUE 0" #Proof of reset 

在代碼將不再工作結束。發生連接重置或沒有任何事情發生,只需將其重置爲TRUE並丟棄FALSE分配。

如何解決這個問題?

+0

底什麼代碼?閃亮的應用程序被設計爲不中斷地運行,直到中斷 – jenesaisquoi

+0

當用戶關閉應用程序時,你可以運行你的註銷功能嗎?如果是這樣看看'session $ onEnded()' –

+0

我正在考慮設置'USER $ Logged < - FALSE'來使登錄無效。我有一些檢查USER $ Logged的邏輯。示例行:'if(USER $ Logged == TRUE){...一些代碼...}' –

回答

0

我不能重現你的錯誤,這段代碼適用於我,所以錯誤可能出現在你的其他服務器邏輯中。

library(shiny) 

ui <- shinyUI(fluidPage(
    actionButton('btn','go') 
)) 

server <- shinyServer(function(input, output){ 
    a <- reactiveValues(l=FALSE) 
    b <- reactiveValues() 
    b$l <- FALSE 

    observe({ 
    print(sprintf('Outisde, A: %s, B: %s',a$l,b$l)) 
    }) 

    observeEvent(input$btn,{ 
    print(sprintf('Inside [before], A: %s, B: %s',a$l,b$l)) 

    a$l <- TRUE 
    b$l <- TRUE 

    print(sprintf('Inside [after], A: %s, B: %s',a$l,b$l)) 
    }) 
}) 

shinyApp(ui=ui,server=server) 
+0

謝謝。 @ oskar-forsmo我試着用停止按鈕進行測試,它工作。我將檢查其他邏輯並可能測試代碼的其他部分。 –

+0

當我發現在USER $ Logged < - FALSE'後面再次將值重置爲TRUE時,我會進行更新。 –

+0

聽起來不錯,請問爲什麼要將observer引用類從observeEvent保存到變量中?如果你想使用它作爲被動,請查看'eventReactive'。無論如何希望你解決這個問題! –

相關問題