Порядок методов в справочном классе 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 даже если ты хотел.

Другие вопросы по тегам