Gre*_*now 11
首先,最好是了解"绑定"是什么.如果我们运行如下代码:
x <- 5
Run Code Online (Sandbox Code Playgroud)
那么计算机内部发生的事情就是我们将5的值放入内存槽中,我们还将"x"这个名称"绑定"到该位置和值,以便以后我们可以使用x,它将会转到内存位置并查找值(直到我们将其更改为其他内容为5).这称为静态绑定,因为除非程序专门进行更改,否则该值不会更改.
活动绑定类似于我们将变量名称(如"x")绑定到某个东西,但这不仅仅是一个常量值,而是每次我们尝试访问时都会运行的函数x.因此,您可以将名称"x"绑定到调用的函数,rnorm然后每次访问x时都会看到不同的随机正常值.
另一个例子,考虑我们是否使用静态绑定执行某些操作:
mydf <- data.frame( x=1:10, y=10:1 )
df.size <- nrow(mydf)
mydf <- data.frame(z=1:100)
Run Code Online (Sandbox Code Playgroud)
现在变量df.size具有mydf创建时的行数,而不是它现在有多少行(因为nrow运行一次,然后结果df.size作为静态绑定放入变量,它不会随着数据框的更改而更新).另一方面,如果我们在df.size运行的函数和运行的函数之间创建了一个活动绑定nrow(mydf),df.size那么只要我们查看它的"值",它就会显示当前的行数,mydf无论我们改变多少次.
1)R在R中,主动绑定的想法是你可以定义看起来像变量的东西,但它实际上每次访问时都会调用一个函数.
例如,在makeActiveBinding每次下面的语句randomNo用作变量之后,它调用第二个参数中指定的函数makeActiveBinding(在这种情况下生成一个正常的随机变量)并返回函数的值:
makeActiveBinding("randomNo", function() rnorm(1), .GlobalEnv)
set.seed(123) # for reproducibility
randomNo
## [1] -0.5604756
randomNo
## [1] -0.2301775
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
3)R6 - 第二个例子 另一个例子可以在这里的R6主动绑定文档中 找到.在该示例中,每次x2访问字段时,就好像它是普通字段一样,对与之关联的函数进行调用x2(不向其传递任何参数),并且值x2是运行该函数的结果.