【问题标题】:In object-oriented R programming, what is an "active binding"?在面向对象的 R 编程中,什么是“主动绑定”?
【发布时间】:2015-11-20 17:18:39
【问题描述】:

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

【问题讨论】:

  • help.search("active binding") > ?bindenv > 示例
  • @JoshuaUlrich:虽然这可能是一个正确的技术描述,但对于还不了解绑定是什么的人来说,这并不是很有启发性......

标签: r oop r6


【解决方案1】:

首先最好了解什么是“绑定”。如果我们运行如下代码:

x <- 5

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

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

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

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 的“值”,它就会显示mydf 中的当前行数没有不管我们改变多少次。

【讨论】:

  • Greg 的示例描述了符号如何绑定到“数据”变量或函数,但在这两种情况下,绑定都是静态的;函数与整数向量 (INTSXP) 一样是 R 对象(技术上是 S 表达式,例如 CLOSXP)。 R 的活动绑定是看起来像变量但行为类似于具有“获取”和“设置”功能的函数的符号——Gabor 答案中的 randomNo 符号。一个对象系统(参考类或 R6)会基于这个古怪的“实验性”功能(参见?makeActiveBindng),这让我感到很奇怪。
【解决方案2】:

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

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

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 的值为运行该函数的结果。

【讨论】:

  • 扩展活动绑定示例以显示“获取”和“设置”功能可能会更好,fred 上的 ?makeActiveBinding 示例。
  • 我认为这不合适。这是对 R6 中的主动绑定的回答,而不是关于它的完整教程。我已经提供了一个小插图的链接,可以在其中找到更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2023-03-31
  • 2011-06-29
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多