Ich bin ein fließender, langjähriger R-Benutzer und fange an, mich mit Klassen und Methoden vertraut zu machen. Ich bin noch sehr neu und arbeite Konzepte durch.R S4 Methoden, die auf eine Liste von Objekten in einer Klasse angewendet werden
Speziell heute versuche ich eine Methode auf eine Liste von Objekten anzuwenden, die alle in einer bestimmten, benutzerdefinierten Klasse sind.
Nehmen Sie dieses Beispiel:
#define car
setClass("car",
representation(
name = "character",
mpg = "numeric"
)
)
#create some cars
cars <- lapply(1:nrow(mtcars), function(x) new("car", name =
rownames(mtcars)[x], mpg = mtcars$mpg[x]))
##SAMPLE MPG GROWTH METHOD
setGeneric("grow.mpg", function(car) {
standardGeneric("grow.mpg")
})
setMethod("grow.mpg",
signature("car"),
function(car){
old_mpg <- [email protected]
[email protected] <- [email protected] * .1 + [email protected]
message(paste("growing mpg on ", [email protected], " from ", old_mpg, " to
", [email protected], sep = ''))
return(car)
})
#APPLY METHOD
cars[[1]] <- grow.mpg(cars[[1]])
growing mpg on Mazda RX4 from 25.41 to 27.951
Diese wächst erfolgreich mpg um 10% auf cars[[1]]
:
cars[[1]]
An object of class "car"
Slot "name":
[1] "Mazda RX4"
Slot "mpg":
[1] 27.951
Aber die Anwendung Methode grow.mpg
allen cars
führt den folgenden Fehler:
cars <- grow.mpg(cars)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘grow.mpg’ for
signature ‘"list"’
Also zwei Fragen:
- Warum ist das?
- Wie kann ich
grow.mpg
auf allecars
anwenden?
Vielen Dank im Voraus!
oh wie einfach ist es, die einfachen Dinge zu übersehen, wenn Sie tief in ein neues Konzept eintauchen. Ich schätze die Hilfe. –