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

R S4 Methods Applied to List of Objects in a Class

我是一个流利的 R 长期用户,我开始熟悉 classes 和方法。我对此还很陌生,并且正在研究概念。

特别是今天,我试图将一种方法应用于对象列表,所有对象都在特定的用户生成的 class.

举个例子:

#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

提前致谢!

您已经为 class "car" 的对象定义了 grow.mpg 函数。 class(cars[[1]]) 是 "car" 但 class(cars) 是 "list"。

就像 R 中的其他任何东西一样(并不是 S4 真正独有的 classes),每当你想对列表中的每个元素应用相同的函数并获得一个新列表时,返回,你只需使用 lapply

cars <- lapply(cars, grow.mpg)