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

时间:2017-11-17 22:15:40

标签: r class methods s4

我是一个流利的,长期的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]]

成功将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
  3. 提前致谢!

1 个答案:

答案 0 :(得分:2)

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

就像R中的其他任何东西一样(并且对S4类来说并不是唯一的),每当您想要将相同的函数应用于列表中的每个元素并获得新的列表时,只需使用lapply

cars <- lapply(cars, grow.mpg)