2012-08-06 4 views
2

Venables 및 Ripley가 저술 한 "통계 및 계산"이라는 책에는 일반 그룹 함수 Math에 대한 클래스 "다항식"의 개체에 대한 메서드 함수 정의에 대한 예제가 있습니다. Math는 abs, acos, acosh 등의 일부 구성 요소 함수가있는 그룹 함수입니다.R의 기능 스위치() 이해하기?

다음은 그룹 일반 함수 Math에 대한 메서드 함수를 정의하는 책에서 언급 된 코드입니다 (코드는 S4 클래스 용입니다. (새로운 스타일의 R/S 클래스)) :

setMethod("Math", "polynomial", 
      function(x) { 
      switch(.Generic, ceiling = , floor = , 
      trunc = polynomial(callGeneric([email protected]), rat = [email protected]), 
      stop(paste(.Generic, "not allowed on polynomials")) 
      )} 
     ) 

나는 그것이 클래스 "다항식"의 객체라고 할 때 setMethod를()로 우리는 일반적인 함수 수학하는 방법 기능을 정의하는 것으로 알고 있습니다. 여기서 어떤 스위치가 작동하는지 설명해 주시겠습니까? 나는 스위치의 R 도움말을 읽을 수는 있지만 여전히 어려움이 아래 부분 이해가 : 다항식 함수는 위의 클래스 "다항식"의 객체를 생성하는 생성자 함수입니다

switch(.Generic, ceiling = , floor = , 
      trunc = polynomial(callGeneric([email protected]), rat = [email protected]), 
      stop(paste(.Generic, "not allowed on polynomials")) 
      )} 

참고.

답변

1

.Generic은 현재 기능을 호출하는 데 사용되는 이름을 식별합니다. 함수가 ceiling, floor 또는 trunc으로 호출 된 경우 주어진 구현 polynomial(callGeneric([email protected]), rat = [email protected])이 호출되면 그렇지 않습니다. 그렇지 않으면 오류가 인쇄됩니다. ceilingfloor에서 볼 수있는 = 뒤에 오는 빈 인수는 폴스 스루 (through-through)를 의미합니다. 실제 코드가 들어있는 다음 인수는 실행 된 인수가됩니다.

+0

감사합니다. @MvG. 당신의 대답은 매우 도움이되었습니다. – Sam

+0

누군가이 대답을 downvoted, 이렇게 특별한 이유가 있습니까? 내가 만든 모든 오류? 나는 코멘트를 주시면 감사하겠습니다. – MvG

+0

나는 실제로 대답 모두 +1을 주었고 대답은 나의 주요 질문 중 두 가지 (. 일반 및 =)를 지적했기 때문에 나는 "받아 들인 대답"을 주었다. – Sam

3

나는 그것이 코드로 연주 유익한 생각 (나는 보급에 대한 생각이 이해가 난 그냥 관찰 된 것과 순전히, 나는 심지어이 방법으로 스위치를 사용할 수 몰랐) :

코드를 함수의 외부 실행 불통 :

test <- "ceiling" 
test <- "floor" 
test <- "trunc" 

switch(test, 
    ceiling = , 
    floor = , 
    trunc = mean(1:10), 
    stop(paste(test, "not allowed on polynomials")) 
) 

은 시험 조건의 각을 시도하고 당신이 천장, 바닥이나 그것이 =을 TRUNC 무엇을 반환 TRUNC 경우에 것을 볼 수 있습니다. 바닥에 물건을 넣는 경우 :

test <- "floor" 

switch(test, 
    ceiling = , 
    floor = 5, 
    trunc = mean(1:10), 
    stop(paste(test, "not allowed on polynomials")) 
) 

다른 응답을 얻습니다.

제가 틀릴 수도 있지만 나는이 기록되어 있다고 생각 :이 해석이 정확

if (.Generic %in% c(ceiling, "floor", "trunc"){ 
    polynomial(callGeneric([email protected]), rat = [email protected]) 
} else { 
    stop(paste(.Generic, "not allowed on polynomials")) 
} 

관심이 있다면 그러나이 특정 상황에 익숙하지 않은입니다.

+0

@Tyler Rinker에 감사드립니다. 100 % 동의합니다. 코드를 좀 더 익숙하게 사용해야했습니다. 내 문제는 주로 trunc을 생성자와 동일하게 정의하고 왜 일반을 다시 정의 하는지를 파악하는 것이 었습니다. 당신의 대답에 감사드립니다. – Sam