2017-11-17 14 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 <- 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을 적용하는 다음과 같은 오류가 발생합니다

그래서 두 가지 질문 :

  1. 왜인가요?
  2. grow.mpg을 모두 cars에 어떻게 적용합니까?

미리 감사드립니다.

답변

2

클래스 "car"의 객체에 대해 grow.mpg 함수를 정의했습니다. class(cars[[1]])은 "자동차"이지만 class(cars)은 "목록"입니다.

R의 다른 것과 마찬가지로 (S4 클래스에만 국한된 것은 아닙니다), 목록의 모든 요소에 동일한 함수를 적용하고 새 목록을 얻으려고 할 때마다 lapply을 사용하면됩니다.

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

아, 새로운 개념에 깊이 들어가면 간단한 것을 간과하는 것이 얼마나 쉬운가요? 도움에 감사드립니다. –