我是一个流利的,长期的R用户,我开始熟悉类和方法。我对此仍然很陌生并且正在研究概念。
具体到今天我正在尝试将方法应用于对象列表,所有这些对象都在特定的用户生成的类中。
举个例子:
#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 <- car@mpg
car@mpg <- car@mpg * .1 + car@mpg
message(paste("growing mpg on ", car@name, " from ", old_mpg, " to
", car@mpg, sep = ''))
return(car)
})
#APPLY METHOD
cars[[1]] <- grow.mpg(cars[[1]])
growing mpg on Mazda RX4 from 25.41 to 27.951
cars[[1]]
:
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
?提前致谢!
答案 0 :(得分:2)
您已为类“car”的对象定义了grow.mpg
函数。 class(cars[[1]])
是“汽车”,class(cars)
是“列表”。
就像R中的其他任何东西一样(并且对S4类来说并不是唯一的),每当您想要将相同的函数应用于列表中的每个元素并获得新的列表时,只需使用lapply
。
cars <- lapply(cars, grow.mpg)