makeReactiveBinding don't work with observeEvent

Can in same cases value created by makeReactiveBinding and changed by setting a unique value, not to trigger observeEvent expression?

I have code like this:

    createEvent = function(name, value = NULL) {
      if (!name %in% ls(self$events)) {
        if (FALSE && is.null(value)) {
          self$events[[name]] <- TRUE
        } else {
          data <- list(
            value = value,
            timestamp = as.numeric(Sys.time())*1000
          )
          self$events[[name]] <- data
        }
        print(paste("makeReactiveBinding", name, self$id))
        makeReactiveBinding(name, env = self$events)
      }
    },
    trigger = function(name, data) {
      if (name %in% ls(self$events)) {
        print(paste("trigger", name, self$id))
        if (is.null(data)) {
          self$events[[name]] <- isolate(!self$events[[name]])
        } else {
          print(paste("handlers", length(private$handlers[[name]])))
          if (length(private$handlers[[name]]) > 0) {
            print(private$handlers[[name]][[1]]$handler)
          }
          data$timestamp <- as.numeric(Sys.time())*1000
          print(avengersBase::json(isolate(self$events[[name]])))
          self$events[[name]] <- data
          print(avengersBase::json(isolate(self$events[[name]])))
        }
      }
    }
  ),
    on = function(event, handler, input = FALSE, enabled = TRUE, init = FALSE, ...) {
      if (enabled) {
        if (is.null(private$handlers[[event]])) {
          private$handlers[[event]] <- list()
        }
        uuid <- uuid::UUIDgenerate()
        observer <- if (input) {
          observeEvent(self$input[[event]], {
            handler(self$input[[event]], self)
          }, observerName = uuid, ignoreInit = !init, ...)
        } else {
          self$createEvent(event)

          print(paste("created", event, self$id))

          observeEvent(self$events[[event]], {
            print(paste('>>>> handler ', event))
            if (is.null(self$events[[event]])) {
              handler()
            } else {
              data <- self$events[[event]]
              handler(data$value, data$target)
            }
          }, observerName = uuid, ignoreInit = !init, ...)
        }

        private$handlers[[event]] <- append(private$handlers[[event]], list(
          list(
            handler = handler,
            uuid = uuid,
            observer = observer$observer
          )
        ))
        print(paste("-----", event, self$id, length(private$handlers[[event]])))
      }
    },

and I'm calling:

self$on("update", function(value, target) {
})
private$trigger(name, list(value = NULL, target = self$id))

which is basically:

event <- "some.event"
handler <- function() { print("x") }
makeReactiveBinding(event, env = self$events)
observeEvent(self$events[[event]], {
   handler()
})
self$events <- list(timetamp = as.numeric(Sys.time())*1000)

but called from R6Class constructor. It was working in every other way. My event system based on reactive Values was working without problems until now.

This is very wierd I've wrapped my handler in tryCatch and it didn't show any errors but when I've change observeEvent to observe it throw some errors (but maybe that's only because observe always run on init).

This topic was automatically closed 54 days after the last reply. New replies are no longer allowed.