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"’
所以有两个问题:
- 这是为什么?
- 如何将
grow.mpg
应用于cars
?
在此先感谢!
答
您已经为类“car”的对象定义了grow.mpg
函数。而class(cars[[1]])
是一个“车”,但class(cars)
是“列表”。
就像R中的其他任何东西(并且对于S4类不是唯一的),只要您希望将相同的功能应用于列表中的每个元素并获取新列表,则只需使用lapply
即可。
cars <- lapply(cars, grow.mpg)
当你深入一个新的概念时,忽略简单的事情是多么容易。我很感激帮助。 –