在面向对象的R编程中(特别是Winston Chang的R6包),什么是active binding?
答案 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
是运行该函数的结果。