2017-11-17 4 views
1

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:

  1. Warum ist das?
  2. Wie kann ich grow.mpg auf alle cars anwenden?

Vielen Dank im Voraus!

Antwort

2

Sie haben Ihre grow.mpg Funktion für Objekte der Klasse "Auto" definiert. Und class(cars[[1]]) ist ein "Auto", aber class(cars) ist "Liste".

Genau wie alles andere in R (und nicht wirklich einzigartig für S4-Klassen), wenn Sie die gleiche Funktion auf jedes Element in der Liste anwenden und eine neue Liste zurück erhalten möchten, verwenden Sie einfach lapply.

cars <- lapply(cars, grow.mpg) 
+0

oh wie einfach ist es, die einfachen Dinge zu übersehen, wenn Sie tief in ein neues Konzept eintauchen. Ich schätze die Hilfe. –

Verwandte Themen