在面向对象的 R 编程中,什么是 "active binding"?

In object-oriented R programming, what is an "active binding"?

在面向对象的 R 编程中(尤其是 Winston Chang 的 R6 包),什么是 active binding

首先最好了解什么是 "binding"。如果我们 运行 代码如下:

x <- 5

然后计算机内部发生的事情是,我们将值 5 放入内存槽中,并且我们还'bound'那个位置和值的名称"x",以便稍后我们可以使用 x ,它将转到该内存位置并查找值(在我们将其更改为其他值之前为 5)。这称为静态绑定,因为除非程序专门进行更改,否则值不会更改。

主动绑定的相似之处在于我们将变量名(如 "x")绑定到某物,但该某物不仅仅是一个常量值,而是一个将成为 运行 的函数每次我们尝试访问 x。因此,您可以将名称 "x" 绑定到调用 rnorm 的函数,然后每次访问 x 时,您都会看到不同的 运行dom 正常值。

另一个例子,考虑一下我们是否用静态绑定做一些事情,比如:

mydf <- data.frame( x=1:10, y=10:1 )
df.size <- nrow(mydf)
mydf <- data.frame(z=1:100)

现在变量 df.size 的行数是 mydf 创建时的行数,而不是现在的行数(因为 nrow 曾经是 运行 ,然后将结果作为静态绑定放入 df.size 变量中,它不会随着数据框的更改而更新)。另一方面,如果我们在 df.size 和 运行 nrow(mydf) 的函数之间创建了一个主动绑定,那么任何时候我们查看 df.size 的 "value" 那么它无论我们更改多少次,都会显示 mydf 中的当前行数。

1) R 在 R 中,active binding 的想法是 你可以定义一些看起来像变量但实际上调用的东西每次访问一个函数

例如,在下面的 makeActiveBinding 语句之后,每次将 randomNo 用作变量时,它都会调用 makeActiveBinding 的第二个参数中指定的函数(在本例中生成一个正常的随机变量)和 returns 函数的值:

makeActiveBinding("randomNo", function() rnorm(1), .GlobalEnv)

set.seed(123) # for reproducibility
randomNo
## [1] -0.5604756
randomNo
## [1] -0.2301775

2) R6 类似地,在 R6 中,活动绑定看起来像一个字段,但在访问时它实际上运行一个函数并返回函数的值。

这里是 (1) 使用 R6 活动绑定重做的示例。请注意,每次访问字段 randomNo 时,都会调用相关函数(生成正常的随机变量)并将其值作为字段的值返回。

library(R6)
RandomClass <- R6Class("Numbers",
  active = list(
    randomNo = function() rnorm(1)
  )
)

set.seed(123)
randomObject <- RandomClass$new()
randomObject$randomNo
## [1] -0.5604756
randomObject$randomNo
## [1] -0.2301775

3) R6 - 第二个示例 另一个示例可以在 R6 主动绑定文档中找到 here。在该示例中,每次访问字段 x2 时就好像它是一个普通字段一样,都会调用与 x2 关联的函数(不向其传递任何参数)和值x2 是 运行 该函数的结果。