Экспериментируя с новыми эталонными классами в R, я заметил странное поведение, если вы используете нотацию «[[]]» для методов (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"
Я столкнулся с этим потому, что я хочу сгруппировать свои объекты в список и создать функцию «applyMethod», которая применяет указанный метод к каждому из объектов внутри. Поэтому мне нужно указать метод в виде строки. Есть ли у кого-нибудь идеи, как я могу этого добиться?