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

his*_*eim 6 oop r r6

在面向对象的R编程(特别是Winston Chang的R6包)中,什么是主动绑定

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无论我们改变多少次.

  • Greg的例子描述了符号如何绑定到"数据"变量或函数,但在这两种情况下,绑定都是静态的; 函数既是R对象(技术上,S表达式,例如,CLOSXP),也是整数向量(INTSXP).R的活动绑定是看起来像变量的符号,但是具有'get'和'set'功能的函数 - Gabor的答案中的`randomNo`符号.对象系统(参考类或R6)将基于这种古怪的"实验"特征(参见`?makeActiveBindng`),这总是让我感到奇怪. (3认同)

G. *_*eck 8

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