2015-05-04 11 views
8

Im Schreiben einer S4-Klasse, in der die internen Daten in einer Datenbank gespeichert sind und die Klasse meist ein Gatekeeper für den Zugriff auf und die Änderung von Informationen in der Datenbank ist. Die Klasse würde Methoden wie getInfoA und getInfoA<- zum Extrahieren und Festlegen bestimmter Informationen haben.So implementieren Sie Subset Replacement für S4-Methoden

Meine Frage bezieht sich auf den folgenden Fall:

myObject <- new('myClass', db='path/to/database') 
getInfoA(myObject)[1:5] <- letters[1:5] 

Hier ist die Setter vor der Zuweisung subsetted wird. Normalerweise wird dies automatisch gelöst, wenn die Daten in Standard-R-Strukturen gespeichert werden, aber wie kann man mit diesen Daten vernünftig umgehen, wenn die Daten an anderer Stelle gespeichert werden? Es gibt eine [<- primitiven innerhalb von R, aber es ist mir nicht klar, wie die Abfertigungs gehen und wo und wie es abfangen ...

Antwort

1

Leider habe ich keine gute Erklärung dafür, aber es funktioniert aus dem Kasten heraus. Vielleicht könnte ein R-Experte das klären.

Der Hauptgrund könnte sein, dass R nie etwas ersetzt, sondern schafft eine neue Kopie des Objekts (mit einigen Ausnahmen wie die primitiven Operatoren, beispielsweise [[<- , die an Ort und Stelle unter bestimmten Bedingungen ersetzen könnten).

myClass <- setClass("myClass", slots=c(letters="character")) 

setGeneric("getLetters", function(x)standardGeneric("getLetters")) 
setGeneric("getLetters<-", function(x, value)standardGeneric("getLetters<-")) 

setMethod("getLetters", "myClass", function(x) { 
    [email protected] 
}) 

setReplaceMethod("getLetters", c("myClass", "character"), function(x, value) { 
    message("value: ", paste0(value, collapse=", ")) 
    [email protected] <- value 
    x 
}) 

a <- myClass(letters=LETTERS[1:10]) 
tracemem(a) 
# [1] "<0x3716b40>" 
getLetters(a) 
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" 
getLetters(a)[1:5] <- letters[1:5] 
# tracemem[0x3716b40 -> 0x39439c8]: 
# tracemem[0x39439c8 -> 0x3293f70]: 
# value: a, b, c, d, e, F, G, H, I, J 
# tracemem[0x3293f70 -> 0x34aae60]: getLetters<- getLetters<- 

So was scheint grundsätzlich zu passieren, wenn Sie getLetters(a)[1:5] <- letters[1:5] nennen, ist der folgende:

value <- getLetters(a) 
value <- c(letters[1:5], value[6:10]) 
a <- `getLetters<-`(a, value=value) 
+0

Das ist schade - es effektiv Abstraktionen über alternative Speichermethoden Krüppel ... Dank für obwohl es in der Suche – ThomasP85