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).