考虑一下这个推介会Joe Cheng 解释了他和他的同事如何在闪亮中实现响应式框架(其灵感来自于Meteor):
实际问题
有人可以向我解释一下我将如何找到一个反应式对象的依赖关系(即列出它们的名称和环境,实际访问它们等),这些是由shiny::reactive()
?
更具体地说,我想在我的自定义“一站式”功能中使用该信息setShinyReactive(包裹reactr)建立在闪亮的功能之上。
它必须以某种方式可以通过这些组件/类之一的方法实现:
- a 电抗导体(我猜主要是课堂
shiny::Observable
)
- a 反应端点/观察者(我猜主要是课堂
shiny::Observer
)
- a 反应性语境(我猜主要是课程
shiny::Context
and shiny::ReactiveEnvironment
)
但我仍然对这方面的实际细节感到困惑。
尽职调查
你可以找到我用于逆向工程工作的闪亮版本的分叉版本here. This .Rnw file代表了我目前的知识状况以及有关实际实施的问题。
简短的例子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()
背景:双向绑定
我希望能够做到这一点的原因是我希望能够指定双向反应性结合通过原始(或仅稍作修改)的闪亮功能(例如,请参阅此README).
乔,到目前为止一直非常乐于助人且专注,但他的时间也很短,他让我开始了以下内容:
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) {
[...]
}
}
[...]
}
})
)
这仅适用于双向反应性对象,因为它们有点“混合体”:两者电抗导体 and 无功源同时。
这就是为什么我需要弄清楚是否双向情况存在或不存在 - 这反过来意味着我需要找出每个对象的依赖关系
对于我的另一个,有点“行人”,采取基于反应setReactive,我通过方法查询了双向依赖.hasBidirectional。这就是我想从正确的闪亮实例/类中检索的信息,该实例/类实际上在某处保存了该信息。