Лучший способ сделать то, что вы хотите, это isolate
использовать все значения rv.haschanged
в вашем реактивном выражении, чтобы они не аннулировали выражение, а затем использовать промежуточное реактивное значение, которое может включать в себя желаемую логику.
Вместо того, чтобы использовать изменения в rv.haschanged()
для аннулирования вашего реактивного выражения, мы создадим новое реактивное значение под названием check
, которое просто содержит счетчик, который увеличивается, когда rv.haschanged
изменяется И равен TRUE
check <- reactiveVal(0)
observeEvent(rv.haschanged(), if (rv.haschanged() == TRUE) check(check() + 1))
Теперь мы можем выделить rv.haschanged()
в нашем реактивном выражении, используя isolate
:
rv <- reactive({
check()
isolate(rv.haschanged(FALSE))
cars[sample.int(nrow(cars), 1),] # return cars dataset as an example
})
или изменив его на eventReactive
, который работает как reactive
, но изолирует все внутри valueExpr
:
rv <- eventReactive(check(), {
rv.haschanged(FALSE)
cars[sample.int(nrow(cars), 1),] # return cars dataset as an example
})
Это что-то вроде взлома, но, насколько мне известно, нет способа замкнуть недействительным выражение реактивного выражения: оно либо действительное (неизменное), либо недействительное (измененное). Когда я работал в блестящем режиме, мне было полезно разбивать реактивные выражения на более мелкие куски (особенно если они содержат задачи, требующие много времени), чтобы минимизировать объем кода, который необходимо повторно запускать, когда что-то становится недействительным.