four-eyes
four-eyes

Reputation: 12490

Shiny variable overwriting

I am having something like

step <- 0

observeEvent(input$myInput, {
    print(step)
    if(!is.null(input$myInput) && step == 0 {
        # do something
        step <- 1
        print(step)
     } else if(!is.null(input$myInput) && step == 1) {
       # do something
       print("Been in second condition")
     } else {
       # do something else
     }
})

When I execute my app and the observeEvent kicks in for the first time, step is as expected 0 and the first if-condition starts. At the end it sets step <- 1. The print() in there shows me that step is 1. However, when the observeEvent kicks in the second time, step still is 0. Thats what the print statements show. Why is that?

Upvotes: 1

Views: 226

Answers (1)

John Paul
John Paul

Reputation: 12704

I think this is basically a scoping issue. Your handler expression - the stuff in observeEvent between the brackets, is treated as its own function. If you look at the code for observeEvent the handlerExpr argument is converted to a function via exprToFunction().

In your handler expression step is not defined, so it get the value 0 from outside the expression. Within the expression step is incremented to one, but that is only within that instance of the handlerExpr, that does not carry outside to change the original value of step to 1.

Upvotes: 1

Related Questions