Kürzlich ist das folgende Problem in meinem R-Code aufgetreten. In einer Funktion, die einen Datenrahmen als Argument akzeptiert, musste ich eine Spalte mit Daten, die basierend auf den Werten der ursprünglichen Spalte des Datenrahmens berechnet wurden, hinzufügen (oder ersetzen, falls vorhanden). Ich schrieb den Code, aber die Prüfung ergab, dass Datenrahmen extrahieren/ersetzen Operationen, die ich verwendet habe, führte zu einem Verlust der speziellen (benutzerdefinierten) Attribute des Objekts.Ansätze zum Beibehalten von Objektattributen beim Extrahieren/Ersetzen von Operationen
Danach realisieren und dieses Verhalten bestätigt durch R Lesen der Dokumentation (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.html), entschied ich mich sehr einfach, das Problem zu lösen - durch die Attribute vor dem Extrakt Speichern/Ersetzen-Operationen und Wiederherstellung sie danach:
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)
}
Dieser Ansatz funktionierte. Doch aus Versehen, lief ich über ein anderes Stück R Dokumentation (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.data.frame.html), das bietet meine Meinung nach einer interessanten (und möglicherweise auch eine allgemeinere?) alternativer Ansatz auf das gleiche Problem zu lösen:
## 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"
würde ich ,
die beiden oben genannten Ansätze Vergleich, wenn sie vergleichbar sind (ich weiß, dass der zweite Ansatz für Datenrahmen definiert ist, aber ich vermute, dass es sein kann: wirklich zu schätzen, wenn die Menschen hier helfen könnte durch verallgemeinert zu irgendwelchen Objekt);
Erklären die Syntax und die Bedeutung in der Definition der Funktion im zweiten Ansatz, vor allem
as.data.frame.avector
, als auch, was ist der Zweck der Linieas.data.frame.avector <- as.data.frame.vector
.
Der Autor der verknüpften Frage besagt, dass der Ansatz, nur Attribute zu speichern und wiederherzustellen (der "erste Ansatz" in der Terminologie meiner Frage), nicht funktioniert. Aber es scheint für mich zu funktionieren und ich frage mich, was ich vermisse. –