Порядок методов в справочном классе R и нескольких файлах
Есть одна вещь, которая мне действительно не нравится в ссылочном классе R: порядок написания методов имеет значение. Предположим, ваш класс выглядит так:
myclass = setRefClass("myclass",
fields = list(
x = "numeric",
y = "numeric"
))
myclass$methods(
afunc = function(i) {
message("In afunc, I just call bfunc...")
bfunc(i)
}
)
myclass$methods(
bfunc = function(i) {
message("In bfunc, I just call cfunc...")
cfunc(i)
}
)
myclass$methods(
cfunc = function(i) {
message("In cfunc, I print out the sum of i, x and y...")
message(paste("i + x + y = ", i+x+y))
}
)
myclass$methods(
initialize = function(x, y) {
x <<- x
y <<- y
}
)
А затем вы запускаете экземпляр и вызываете метод:
x = myclass(5, 6)
x$afunc(1)
Вы получите ошибку:
Error in x$afunc(1) : could not find function "bfunc"
Я заинтересован в двух вещах:
- Есть ли способ обойти эту неприятность?
- Означает ли это, что я никогда не смогу разбить действительно длинный файл класса на несколько файлов? (например, один файл для каждого метода.)
1 ответ
Призвание bfunc(i)
не собирается вызывать метод, так как не знает, над каким объектом он работает!
В ваших определениях методов, .self
Является ли объект метод (?). Поэтому измените свой код на:
myclass$methods(
afunc = function(i) {
message("In afunc, I just call bfunc...")
.self$bfunc(i)
}
)
(и аналогично для bfunc
). Вы пришли из C++ или какого-то языка, где функции внутри методов автоматически вызываются в контексте объекта?
Некоторые языки делают это более явным, например, в Python метод с одним аргументом, подобным вашему, на самом деле имеет два аргумента, когда он определен, и будет:
def afunc(self, i):
[code]
но называется как:
x.afunc(1)
затем в пределах afunc
Здесь self
переменная, которая ссылается на x
(хотя зову это self
это универсальное соглашение, его можно назвать чем угодно).
В R, .self
немного магии, разбросанной по ссылочным классам. Я не думаю, что вы могли бы изменить его на .this
даже если ты хотел.