2015-05-04 9 views
8

Sto scrivendo una classe S4 in cui i dati interni sono memorizzati in un database e la classe è principalmente un gatekeeper per accedere e modificare le informazioni nel database. La classe avrebbe metodi come getInfoA e getInfoA<- per estrarre e impostare determinate informazioni.Come implementare la sostituzione dei sottoinsiemi per i metodi S4

La mia domanda riguarda il caso seguente:

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

Qui il setter è subsetted prima della cessione. Normalmente questo viene risolto automaticamente quando i dati sono archiviati in strutture R standard, ma come gestirli con garbo quando i dati vengono memorizzati altrove? C'è una primitiva [<- all'interno di R ma non è chiaro a me come va il dispacciamento e dove e come intercettarlo ...

risposta

1

Purtroppo non ho una buona spiegazione per questo, ma sta funzionando fuori dalla scatola. Forse un esperto di R potrebbe chiarirlo.

Il motivo principale potrebbe essere che R non sostituisce nulla, ma crea una nuova copia dell'oggetto (con alcune eccezioni, come gli operatori primitivi, per esempio [[<- che potrebbe sostituire in atto in alcune condizioni).

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<- 

Quindi, quello che sembra fondamentalmente per accadere quando si chiama getLetters(a)[1:5] <- letters[1:5] è la seguente:

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

Questo è un peccato - si paralizza in modo efficace le astrazioni rispetto ai metodi di conservazione alternativi ... grazie per guardare in esso, però – ThomasP85