Recentemente ho riscontrato il seguente problema nel mio codice R. In una funzione, accettando un frame di dati come argomento, avevo bisogno di aggiungere (o sostituire, se esiste) una colonna con i dati calcolati in base ai valori della colonna originale del frame di dati. Ho scritto il codice, ma i test hanno rivelato che il quadro dati operazioni di estrazione/sostituzione, che ho utilizzato, ha provocato una perdita degli attributi speciali (definiti dall'utente) dell'oggetto.Approcci alla conservazione degli attributi dell'oggetto durante le operazioni di estrazione/sostituzione
Dopo aver capito che, e confermando che il comportamento con la lettura di documentazione R (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.html), ho deciso di risolvere il problema in modo molto semplice - per salvando gli attributi prima che l'estratto/sostituire le operazioni e ripristino loro seguito:
myTransformationFunction <- function (data) {
# save object's attributes
attrs <- attributes(data)
<data frame transformations; involves extract/replace operations on `data`>
# restore the attributes
attributes(data) <- attrs
return (data)
}
Questo approccio ha funzionato. Tuttavia, per caso, mi sono imbattuto in un altro pezzo di documentazione R (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.data.frame.html), che offre IMHO un interessante (e, potenzialmente, un più generico?) approccio alternativo per risolvere lo stesso problema:
## keeping special attributes: use a class with a
## "as.data.frame" and "[" method:
as.data.frame.avector <- as.data.frame.vector
`[.avector` <- function(x,i,...) {
r <- NextMethod("[")
mostattributes(r) <- attributes(x)
r
}
d <- data.frame(i = 0:7, f = gl(2,4),
u = structure(11:18, unit = "kg", class = "avector"))
str(d[2:4, -1]) # 'u' keeps its "unit"
lo farei Apprezzo molto se la gente qui potrebbe aiutare:
Confrontando i due approcci di cui sopra, se sono paragonabili (mi rendo conto che il secondo approccio, come definito è per frame di dati, ma ho il sospetto che possa essere generalizzato a nessuno oggetto);
Spiegazione la sintassi e significato nella definizione della funzione nel secondo approccio, soprattutto
as.data.frame.avector
, così come quello che è lo scopo della lineaas.data.frame.avector <- as.data.frame.vector
.
L'autore della domanda collegata afferma che l'approccio del solo "salvataggio e ripristino degli attributi" (il "primo approccio" nella terminologia della mia domanda) non funziona. Tuttavia, sembra funzionare per me e mi chiedo cosa mi manca. –