Вот класс
.A <-
setRefClass("A",
fields=list(x="numeric"),
methods=list(foo=function() x))
Если бы у меня был экземпляр a
и я хотел бы создать вызов метода 'foo', используя '$', я мог бы
eval(substitute(a$FUN(), list(FUN="foo")))
Поэтому я создам класс 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")))
, а затем использую его
> aList <- .Alist$new(.A$new(x=1), .A$new(x=2))
> aList$foo()
[[1]]
[1] 1
[[2]]
[1] 2