在面向对象的R编程中,什么是"主动绑定"?

时间:2015-11-20 17:18:40

标签: r oop r6

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

2 个答案:

答案 0 :(得分:11)

首先,最好是了解"绑定"是。如果我们运行如下代码:

x <- 5
然后,计算机内部发生的事情是我们已将5的值放入内存槽中,并且我们也已经绑定了#39;名称&#34; x&#34;到那个位置和值,以便稍后我们可以使用x,它将转到该内存位置并查找值(直到我们将其更改为其他内容为5)。这称为静态绑定,因为除非程序专门进行更改,否则该值不会更改。

活动绑定类似于我们将变量名称(例如&#34; x&#34;)绑定到某个东西,但是这不仅仅是一个常量值,而是每次我们运行时都会运行的函数尝试访问x。所以你可以绑定名称&#34; x&#34;调用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)的函数之间创建了一个有效绑定,那么每当我们查看&#34;值&#34; df.size然后,无论我们更改多少次,它都会显示mydf中的当前行数。

答案 1 :(得分:9)

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

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

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