2017-11-17 89 views
1

我是一位流利的,長期的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

在此先感謝!

回答

2

您已經爲類「car」的對象定義了grow.mpg函數。而class(cars[[1]])是一個「車」,但class(cars)是「列表」。

就像R中的其他任何東西(並且對於S4類不是唯一的),只要您希望將相同的功能應用於列表中的每個元素並獲取新列表,則只需使用lapply即可。

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

當你深入一個新的概念時,忽略簡單的事情是多麼容易。我很感激幫助。 –