реактивная недействительность на основе (логического) реактивного условного - PullRequest
1 голос
/ 13 марта 2019

У меня есть реактивный rv и реактивный логический rv.haschanged, определенный следующим образом:

rv <- reactive({
  rv.haschanged()

  rv.haschanged(FALSE)

  cars[sample.int(nrow(cars), 1),] # return cars dataset as an example
})

rv.haschanged <- reactiveVal(FALSE)

Теперь есть какой-то наблюдатель, например, который может установить rv.haschanged в TRUE.

observe({
    # do something...

    rv.haschanged(TRUE)
})

Я хочу, чтобы rv обновлял себя только при изменении rv.haschanged на TRUE (а не при rv.haschanged на FALSE).Проблема с приведенным выше кодом заключается в том, что он обновит rv дважды.Один раз после того, как наблюдатель выполнит rv.haschanged(TRUE), и снова из-за rv.haschanged(FALSE).

Какие-нибудь лаконичные и интуитивно понятные идиомы для достижения вышеуказанного?

Редактировать : в основном, всеЯ хочу, чтобы сделать недействительным rv в наблюдателе, поэтому он планирует повторное выполнение.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Лучший способ сделать то, что вы хотите, это 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
})

Это что-то вроде взлома, но, насколько мне известно, нет способа замкнуть недействительным выражение реактивного выражения: оно либо действительное (неизменное), либо недействительное (измененное). Когда я работал в блестящем режиме, мне было полезно разбивать реактивные выражения на более мелкие куски (особенно если они содержат задачи, требующие много времени), чтобы минимизировать объем кода, который необходимо повторно запускать, когда что-то становится недействительным.

0 голосов
/ 14 марта 2019

Это работает:

rv <- eventReactive(rv.haschanged(), {      
  rv.haschanged(NULL)

  cars[sample.int(nrow(cars), 1),] # return cars dataset as an example
})

rv.haschanged <- reactiveVal(NULL)

И наблюдатель:

observe({
    # do something...

    rv.haschanged(TRUE)
})

Используется опция ignoreNULL = TRUE eventReactive. Поэтому вместо FALSE мы используем NULL.

Обратите внимание, что этот не будет работать, если в аргумент eventExpr .

будет добавлено несколько объектов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...