Извлечение реактивных зависимостей, как выведено из блестящего :: реактивного ()

Учти этопрезентация Джо Ченг, где он объясняет, как он и его коллеги реализовали реактивную основу в блестящем (который вдохновленметеор):

Актуальный вопрос

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

Более конкретно, я хотел бы использовать эту информацию в своей пользовательской функции «одного окна»setShinyReactive (пакетreactr), который основывается на блестящей функциональности.

Это должно быть как-то возможно с помощью методов одного из этих компонентов / классов:

a реактивный проводник (Я предполагаю, в основном классshiny::Observable)a реактивные конечные точки / наблюдатели (Я предполагаю, в основном классshiny::Observer)a реактивный контекст (Я предполагаю, в основном классыshiny::Context а такжеshiny::ReactiveEnvironment)

Но я все еще немного растерялся относительно фактических деталей по этому вопросу.

Due Diligence

Вы можете найти мою разветвленную версию блестящего, которую я использовал для моих реверс-инжинирингаВот. это.Rnw файл представляет мое текущее состояние знаний и вопросы о фактической реализации.

Краткий примерshiny::reactive()
require(shiny)
## Ensure that shiny let's us do our thing //
shiny_opt <- getOption("shiny.suppressMissingContextError")
if (is.null(shiny_opt) || !shiny_opt) {
  options(shiny.suppressMissingContextError = TRUE)  
}

a <- 10
shiny::makeReactiveBinding("a")
b <- shiny::reactive(a * 2)
## --> this leads to the inferred result that `b` depends on `a`; 
## this information is stored somewhere in the shiny framework 
## --> that's what I want to get at
b()

a <- 20
b()
Фон: двунаправленные привязки

Причина, по которой я хотел бы иметь возможность сделать это, заключается в том, что я хотел бы иметь возможность указатьдвунаправленные реактивные привязки с помощью оригинальной (или только слегка адаптированной) блестящей функциональности (примеры см.ПРОЧТИ МЕНЯ).

Джо, который был действительно полезным и преданным до сих пор - но у которого также мало времени, заставил меня начать с этого:

require(shiny)
## Ensure that shiny let's us do our thing //
shiny_opt <- getOption("shiny.suppressMissingContextError")
if (is.null(shiny_opt) || !shiny_opt) {
  options(shiny.suppressMissingContextError = TRUE)  
}

suppressWarnings(rm(a, b))
options(shiny.suppressMissingContextError=TRUE)
makeReactiveBinding("a")
makeReactiveBinding("b")
observe(a <<- b)
observe(b <<- a)
shiny:::setAutoflush(TRUE)
(a <- 1)
b
(b <- 2)
a
(a <- 3)
b

Однако для того, чтобы интегрировать это в мою реализациюsetShinyReactiveМне нужно выяснить, если заявлениеo$.value <<- v (в настоящее время строка 203) действителен или нет:

## Call to 'makeActiveBinding' //
makeActiveBinding(
  id,
  env = where,
  fun = local({
    visible
    o
    function(v) {
      if (missing(v)) {

      } else {
        if (strict_set == 0) {
          o$.value <<- v    
          ## --> this should only be allowed for bi-directional relationships
        } else if (strict_set == 1) {

          [...]

        } else if (strict_set == 2) {

          [...]

        }
      }
      [...]
    }
  })
)

Это только в случаедвунаправленная реактивные объекты, поскольку они являются своего рода "гибридами": обареактивные проводники а также реактивные источники в то же время.

Вот почему мне нужно выяснить, еслидвунаправленные ситуации существует или нет - что в свою очередь подразумевает, что мне нужно выяснить зависимости каждого объекта

Для моего другого, своего рода "пешеход", взять на себя реактивность на основеsetReactiveЯ запросил двунаправленные зависимости через метод.hasBidirectional, Это информация, которую я хотел бы получить из правильного блестящего экземпляра / класса, который фактически где-то хранит эту информацию.

Ответы на вопрос(0)

Ваш ответ на вопрос