R S4应用于类中对象列表的方法

R S4应用于类中对象列表的方法

问题描述:

我是一位流利的,长期的R用户,我开始熟悉类和方法。我对这一点仍然很陌生,并且通过概念工作。R S4应用于类中对象列表的方法

具体而言,今天我试图将一个方法应用于一个对象列表,所有对象都在特定的用户生成的类中。

拿这个例子:在cars[[1]]

#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 

这成功地增长MPG 10%:

cars[[1]] 
An object of class "car" 
Slot "name": 
[1] "Mazda RX4" 

Slot "mpg": 
[1] 27.951 

但是应用方法grow.mpg所有的cars引发以下错误:

cars <- grow.mpg(cars) 
Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘grow.mpg’ for 
    signature ‘"list"’ 

所以有两个问题:

  1. 这是为什么?
  2. 如何将grow.mpg应用于cars

在此先感谢!

您已经为类“car”的对象定义了grow.mpg函数。而class(cars[[1]])是一个“车”,但class(cars)是“列表”。

就像R中的其他任何东西(并且对于S4类不是唯一的),只要您希望将相同的功能应用于列表中的每个元素并获取新列表,则只需使用lapply即可。

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

当你深入一个新的概念时,忽略简单的事情是多么容易。我很感激帮助。 –