虽然在RI中尝试使用新的引用类,但如果对方法使用"[[]]"符号(X [["doSomething"]]而不是X $ doSomething),则会发现一些奇怪的行为.这种表示法适用于字段,但我最初认为它不适用于方法,直到我发现如果你执行"class(X $ doSomething)",然后你可以使用"[[]]".下面的简单例子说明了这一点.
setRefClass("Number",
fields = list(
value = "numeric"
),
methods = list(
addOne = function() {
value <<- value + 1
}
)
)
X <- new("Number", value = 1)
X[['value']] # 1
X[["addOne"]]() # Error: attempt to apply non-function
class(X[["addOne"]]) # NULL
class(X$addOne) # "refMethodDef"
# Now the following works!
X[["addOne"]]() # sets X$value = 2
class(X[["addOne"]]) # "refMethodDef"
Run Code Online (Sandbox Code Playgroud)
我遇到这个的原因是因为我想在列表中将我的对象组合在一起并创建一个"applyMethod"函数,该函数在其中的每个对象上应用指定的方法.因此,我需要将方法指定为字符串.有没有人有任何想法我怎么能做到这一点?
这里有一个类
.A <-
setRefClass("A",
fields=list(x="numeric"),
methods=list(foo=function() x))
Run Code Online (Sandbox Code Playgroud)
如果我有一个实例a并想使用“$”构建对“foo”方法的调用,我可以
eval(substitute(a$FUN(), list(FUN="foo")))
Run Code Online (Sandbox Code Playgroud)
因此,我将创建一个类Alist,该类具有类的元素列表A(这可以通过编程方式强制执行),并且具有一个.delegate可以将任意方法应用于列表中所有元素的方法。然后我将添加一个委托方法foo。
.delegate <- function(FUN, ...)
{
lapply(elts, function(elt, ...) {
eval(substitute(elt$FUN(...), list(FUN=FUN, ...)))
})
}
.Alist <-
setRefClass("Alist",
fields=list(elts="list"),
methods=list(
initialize = function(...) callSuper(elts=list(...)),
.delegate = .delegate,
foo=function() .delegate("foo")))
Run Code Online (Sandbox Code Playgroud)
然后使用它
> aList <- .Alist$new(.A$new(x=1), .A$new(x=2))
> aList$foo()
[[1]]
[1] 1
[[2]]
[1] 2
Run Code Online (Sandbox Code Playgroud)