При определении нового ссылочного класса в R существует множество шаблонных методов, которые ожидаются (согласно соглашениям R), например length
, show
и т. Д. Когда они определены, они агрессивно маскируют похожие именованные методы / функции при вызове изнутри методы класса. Поскольку вы не обязательно можете знать пространство имен сторонней функции, использовать спецификатор package::
невозможно.
Есть ли способ указать методу игнорировать свои собственные методы, если они не вызываются специально с использованием .self $?
Пример:
tC <- setRefClass(
'testClass',
fields = list(data='list'),
methods = list(
length=function() {
length(data)
}
)
)
example <- tC(data=list(a=1, b=2, c=3))
example$length() # Will cause error as length is defined without arguments
В качестве альтернативы можно было бы прибегнуть к определению методов S4 для класса (поскольку ссылочные классы - это классы S4 под капотом), но это, похоже, работает против идеи ссылочного класса ...
Изменить: чтобы не сосредотачиваться на тех случаях, когда вы заранее знаете класс данных, рассмотрите этот пример:
tC <- setRefClass(
'testClass',
fields = list(data='list'),
methods = list(
length=function() {
length(data)
},
combineLengths = function(otherObject) {
.self.length() + length(otherObject)
}
)
)
example <- tC(data=list(a=1, b=2, c=3))
example$combineLength(rep(1, 3)) # Will cause error as length is defined without arguments
Я знаю, что можно написать собственную отправку для правильного метода / функции, но это кажется такой распространенной ситуацией, что я подумал, что она, возможно, уже была решена в пакете методов (своего рода обратное usingMethods()
)
У меня такой вопрос, и я прошу прощения, если это не было ясно раньше: есть ли способы игнорировать там методы и поля ссылочного класса в определениях методов и полагаться исключительно на .self для доступа к ним, так что методы / функции, определенные вне класса не замаскированы?
base::length(data)
будет достаточно, чтобы он заработал. - person nicola   schedule 05.10.2014::
, вам нужно будет изучить объекты и выполнить отправку вручную - что R обычно сделает за вас. - person ThomasP85   schedule 05.10.2014