2015-11-11 7 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 $ Записан. Пример строки: 'if (USER $ Logged == TRUE) {... some code ...}' –

ответ

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

Я обновлю, когда обнаружил, что снова сбрасывает значение в TRUE сразу после 'USER $ Logged <- FALSE'. –

+0

Звучит неплохо, могу ли я спросить, почему вы сохраняете ссылочный класс наблюдателя от registerEvent до переменной? если вы хотите использовать его как реактивный, посмотрите на «eventReactive». В любом случае надеемся, что вы решите это! –