2017-11-17 7 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 

これが正常燃費が10%で成長する:

この例を見てみましょう

cars <- grow.mpg(cars) 
Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘grow.mpg’ for 
    signature ‘"list"’ 

cars[[1]] 
An object of class "car" 
Slot "name": 
[1] "Mazda RX4" 

Slot "mpg": 
[1] 27.951 

しかしcarsのすべてに方法grow.mpgを適用するには、次のエラーがスローされます

2つの質問:

  1. なぜですか?
  2. grow.mpgcarsにすべて適用するにはどうすればよいですか?

ありがとうございます!

答えて

2

クラス "car"のオブジェクトに対してgrow.mpg関数を定義しました。 class(cars[[1]])は「車」ですが、class(cars)は「リスト」です。

同じ機能をリストのすべての要素に適用して新しいリストを取得したいときはいつでも、lapplyを使用するだけです。

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

あなたが新しいコンセプトに徹底しているときに、簡単なことを見落とすことは簡単です。私は助けに感謝します。 –

関連する問題