Ich schreibe gerade ein Paket mit Referenzklassen. Ich habe über ein Problem kommen, die aus der Lektüre verschiedene Quellen:Referenzklassen, Registervervollständigung und erzwungene Methodendefinition
Method initialisation in R reference classes
Can't reliably use RefClass methods in Snowfall
entnehme ich, wird dadurch verursacht, dass die Referenzmethoden nicht alle zu jedem kopiert sind in der Klasse Objekt eher sind sie kopiert beim ersten Zugriff.
https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html
Als Beispiel definieren:
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
}
)
)
example <- test$new()
So Beispiel ist ein neues Objekt der Klasse TEST
. Typing example$
und Tabbing in der Konsole gibt
> example$
# example$.->a example$.refClassDef example$.self
# example$a example$initialize
so dass die Methode addone
wird nicht als Option dargestellt. Es ist jedoch zu Aufruf zur Verfügung:
example$addone()
nun wieder Tabbing enthüllt
# >
# > example
# Reference class object of class "TEST"
# Field "a":
# [1] 2
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$field
# example$initialize example$show
so jetzt addone
und field
und show
werden als Optionen dargestellt.
Martin Morgan empfiehlt, die Definition der Methoden in einem der obigen Links zu erzwingen. Diese funktioniert gut
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
.self$addone #force definition
}
)
)
example <- test$new()
so jetzt tabbing gibt:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$initialize
Einige meiner Klassen haben über 30 Methoden so würde Ich mag diese möglichst kurz und bündig tun. Ich habe definiert:
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
eval(parse(text=paste0('.self$',ls([email protected]))))
}
)
)
example <- test$new()
Tabbing gibt jetzt:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$callSuper
# example$copy example$export example$field
# example$getClass example$getRefClass example$import
# example$initFields example$initialize example$show
# example$trace example$untrace
Während dies funktioniert es ein wenig unbeholfen fühlt. Auch [email protected]
wird eher verwendet als getRefClass("TEST")[email protected]
, so dass fühlt sich ein bisschen falsch an. Hat jemand schon einmal mit diesem Problem zu tun gehabt?
Gibt es eine bessere Lösung für eine Lösung? Vielen Dank für jegliche Beratung und Entschuldigung, wenn die Frage übertrieben ist.
Vielen Dank, dass ist sehr hilfreich und eleganter als meine Lösung. Ich wusste auch nicht, dass es Tab-Completion genannt wurde. Mit diesem Begriff konnte ich das relevante Paket in den Utils finden. Tab-Vervollständigung mit Referenzklassen war mein Ziel und ich werde den Fragetitel bearbeiten, um dies besser widerzuspiegeln. – jdharrison
Das scheint sehr vielversprechend. Wäre es eine schlechte Idee, '.DollarNames.envRefClass <- function (x, pattern) grep (Muster, getRefClass (class (x)) $ methods(), value = TRUE)' zu meinem Paket hinzuzufügen? – jdharrison
Ja, es wäre eine schlechte Idee - Sie würden das Verhalten für alle Referenzklassen ändern, nicht nur für Ihre eigenen. Vielleicht mögen manche ihr aktuelles Verhalten, vielleicht werden 'Methoden' zu irgendeinem späteren Zeitpunkt eine super-duper' .DollarNames.envRefClass' implementieren und Ihre lang vergessene Methode wird dies dann überschreiben. R-devel sollte als Feature-Request eingeführt werden, insbesondere, wenn Sie zumindest einen funktionierenden Prototyp haben, um das Verhalten zu veranschaulichen, das Sie für angemessen halten. –