определить методы класса и переменные класса в ссылочном классе R5 - PullRequest
5 голосов
/ 22 апреля 2011

Я хочу знать, как правильно определить методы класса и переменную класса в ссылочном классе R5.

Вот пример:

> # define R5 class XX
> # member variable: ma
> # member method: mfa
> XX <- setRefClass("XX",
+   fields = list(ma = "character"),
+   methods = list(
+     mfa = function() return(paste(ma, "*"))
+     ))
> 
> XX
Generator object for class "XX":

Class fields:

Name:         ma
Class: character

 Class Methods:  
    "callSuper", "copy", "export", "field", "getClass", "getRefClass", "import", "initFields", 
"mfa"


 Reference Superclasses:  
    "envRefClass"

> # create an instance of XX
> x <- XX$new(ma="ma")
> 
> # call member method refering to the member variable.
> x$mfa()
[1] "ma *"
> 
> # here, I define *class* variable
> XX$cc <- "cc"

> # contents of XX
> ls(XX)
[1] "cc"        "className" "def"       "methods"   "new"      

> # here, I define member method referring to the class var.
> XX$methods(mfc = function() {
+   return(XX$cc)
+ })

> # it does work.
> x$mfc()
[1] "cc"

XX$cc <- "cc" ведет себя так, как будто cc является переменной класса XX, но я не уверен, что это правильный путь.
Например, XX $ def <- "hoge" может сломать генератор класса XX. </p>

Итак, я хочу знать, существует ли стандартный способ определения переменной и методов класса.

Спасибо заранее.

1 Ответ

6 голосов
/ 22 апреля 2011

Относительно "стандарта" для переменных класса, такого стандарта не существует. Эталонные классы являются новой возможностью для R, и поскольку некоторые аспекты ОО не описаны в официальной документации по эталонным классам , можно предположить, что они еще не стандартизированы.

Что касается возможности появления такого стандарта, я сомневаюсь в этом. Переменные класса на самом деле являются просто изменчивыми глобальными переменными в псевдо-именном пространстве, и полагаться на внешнее состояние, как правило, нельзя в R-стиле. Существование эталонных классов уже является довольно серьезной уступкой для повышения производительности.

Но, как вы заметили, то, что вы сделали, работает. R - это язык для взрослых по обоюдному согласию, и он не будет пытаться помешать вам создать беспорядок на свой страх и риск.

...