Использование обозначения «[[]]» для методов ссылочного класса

Экспериментируя с новыми эталонными классами в 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», которая применяет указанный метод к каждому из объектов внутри. Поэтому мне нужно указать метод в виде строки. Есть ли у кого-нибудь идеи, как я могу этого добиться?

7
задан Chad Goymer 30 April 2011 в 11:05
поделиться