2014-01-05 2 views
7

나는 NextMethod()이 어떻게 작동하는지 알아 내려고하고있다. S3 클래스 시스템에 대해 가장 자세한 설명은 Chambers & Hastie (edts.)의 통계 모델 S (1993, Chapman & Hall)에 나와 있지만, NextMethod 호출에 관한 부분은 약간 애매합니다. 다음은 내가 이해하고자하는 관련 단락들입니다 (268-269 쪽). 그들은 특별한 호출로 이전 방법에서 호출 된 것처럼 NextMethod()에 호출의 결과로 호출 방법에 돌아 가면`NextMethod()의 내부 동작

, 이러한 동작합니다. 상속 된 메서드에 대한 호출의 인수는 현재 메서드 호출에서 숫자, 순서 및 실제 인수 의 이름과 동일합니다 (따라서 generic에 대한 호출은 입니다). 그러나 인수의 표현식은 이며 현재 메소드의 해당 형식 인수의 이름입니다. 예를 들어, 표현식 print(ratings)에 이 있다고 가정하면 print.ordered() 메서드가 호출됩니다. 이 방법 NextMethod()를 호출 할 때, 이것은이 x print.ordered()의 프레임에서 여기 x이다 의 print.factor() 호출 형태 print.factor(x), 동일하다. 여러 인수가 형식 인수 "..."과 일치하면 해당 인수는 상속 된 메서드 y 특수 이름 "..1", "..2"등의 호출에서 나타납니다. 평가자는 을 인식하고 적절하게 처리합니다 예 : 의 경우 476

이 오히려 미묘한 정의는 함수의 의미가 방법의 사용으로 깨끗하게 가능한을 통해 S 캐리의 호출을 보장하기 위해 존재한다 (비교 베커, 챔버와 윌크스의 새로운 S 언어, 페이지 354) . 특히 :

  • 인수는 NextMethod()이 호출 될 때 현재 값을 사용하여 현재 메소드에서 상속 된 메소드로 전달됩니다.
  • 지연 평가가 계속 적용됩니다. 평가되지 않은 주장은 평가 절하로 남아 있습니다.
  • 상속 된 메서드에서 누락 된 인수가 누락 된 채로 있습니다.
  • 인수가 에서으로 전달되면 "..."정규 인수가 올바른 인수 이름으로 도착합니다. 호출에 실제 인수에 해당하지 않는 프레임에서
  • 객체는 상속 된 메서드에 전달되지 않습니다. "

상속 과정은 지금까지 인수 가서 기본적으로 투명합니다.

  1. "현재의 방법은"무엇이며 "이전의 방법은"무엇을 : 나는 혼란을 찾을

    두 포인트는?

  2. "상속 된 메서드 호출의 인수", "인수의 식"및 "현재 메서드의 해당 형식 인수의 이름"의 차이점은 무엇입니까?

일반적으로 누군가 위의 단락에서 주어진 설명을 루시퍼 방식으로 다시 말하면 좋을 것입니다.

답변

4

이 모든 게시물을 살펴보기가 어렵지만,이 작은 예제가 다음 메서드 디스 패칭을 신비하게 도울 수 있다고 생각합니다.

2 개의 클래스 속성 (상속) 'first'와 'second'로 객체를 만듭니다.

x <- 1 
attr(x,'class') <- c('first','second') 

그때 나는 각 클래스에 대한 Cate 방법을 정의

Cate <- function(x,...)UseMethod('Cate') 

내 개체를 인쇄 할 generic 방법 Cat을 만들 수 있습니다.

Cate(x,1:3) 
Cate.first(x = x, 1:3) 
[1] "first: 1" 
[1] "---------------------" 
Cate.second(x = x, y = 1:3) 
[1] "second: 1 1" "second: 1 2" "second: 1 3" 
  • 이 Cate.second를 들어 이전 방법은 Cate.first
  • 입니다
  • 인수 x와 y가에서 아래로 전달됩니다

    이제
    Cate.first <- function(x,...){ 
        print(match.call()) 
        print(paste('first:',x)) 
        print('---------------------') 
        NextMethod()    ## This will call Cate.second 
    } 
    
    Cate.second <- function(x,y){ 
        print(match.call()) 
        print(paste('second:',x,y)) 
    } 
    

    이 예제를 사용 Cate 전화를 확인하실 수 있습니다 현재 메서드를 상속 된 메서드에 전달하고 NextMethod()가 호출 될 때 현재 값을 사용합니다. f.orderedf.factor를 호출,

  • 인수 Y는 일반적인 기능 f가 호출되는 경우 올바른 인수 이름 Cate.second(x = x, y = 1:3)
3

이 예제를 고려에 도착 "..."형식 인수를 통과하며 NextMethod를 사용하여, 다음 f.ordered 및 호출 :

,536 :

> f <- function(x) UseMethod("f") # generic 
> f.ordered <- function(x) { x <- x[-1]; NextMethod() } 
> f.factor <- function(x) x # inherited method 
> x <- ordered(c("a", "b", "c")) 
> class(x) 
[1] "ordered" "factor" 
> f(x) 
[1] b c 
Levels: a < b < c 

이제 원래의 텍스트를 고려

NextMethod()에 대한 호출의 결과로 호출 된 메소드로 전환하면 이전 메소드에서 호출 된 것처럼 동작합니다 ( 특수 호출).

여기 f 그래서 "NextMethod에 대한 호출의 결과로 호출"이 방법은 f.factor이며, 이전 방법은 f.ordered입니다 f.factor를 호출 f.ordered 호출합니다. 상속 된 메소드에 대한 호출

인수는 (일반 호출에 따라서 등) 개수, 순서, 및 전류 메소드 호출의 조건과 실제의 인자 이름에서 동일 . 그러나 인수에 대한 표현식은 현재 메소드의 해당 형식 인수에 해당하는 의 이름입니다. 예제의 경우 print (ratings) 표현식이 print.ordered() 메소드를 호출했다고 가정합니다. 이 메서드가 NextMethod()를 호출하면 this는이며 print.factor (x) 형식 인의 print.factor()와 같습니다. 여기서 x는 print.ordered()의 프레임에서 x입니다.

이제 우리는 원근법을 전환하고 우리는 f.ordered에 앉아 있으므로 f.ordered 은 현재 방법이고 f.factor은 상속 된 방법입니다. f.ordered 특별한 호출을 인수 제외한 일반 ff.ordered 및 로 전달과 동일 그들이 (f.ordered에서 인수의 버전을 참조하는 것이 f.factor 전화를 을 구성되어 NextMethod() 호출하는 시점에서

어느 쪽이 f.factor

호출하기 전에 은 여기에 차이가 있습니다.
관련 문제