2015-01-13 3 views
3

현재 S4 클래스에 대한 메쏘드를 작성 중이고 메쏘드 호출을 함수처럼 사용하고 match.call()을 사용하고 싶습니다. 내가 뭐하는 거지의 다음R match.call() for S4 메쏘드

내 최소한의 예 :

> meth1(new("AClass"), method = "MClust") 
.local(object = object, method = "MClust") 
[1] NA 
> meth1(new("AClass"), method = Mclust) 
.local(object = object, method = ..1) 
[1] NA 

질문은 다음과 같습니다 :

  1. 왜 기능을 할당 할 때 내가 볼이 정의와

    setClass(
        Class = "AClass", 
        representation = representation(
        name = "character" 
    ) 
    ) 
    
    setGeneric("meth1", function(object, ...) { 
        standardGeneric("meth1") 
    }) 
    
    setMethod(
        f = "meth1", 
        signature = "AClass", 
        definition = function(object, method, ..., warnings = TRUE) { 
        # ... 
        print(match.call()) 
    
        return(NA) 
    }) 
    

    인수 'method'에이 인수에 대해 match.call()에서 가져온 내용이인 경우insetad for "Mclust"?

  2. match.call()에서 가져온 '함수 이름'이 meth1 대신 .local 인 이유는 무엇입니까?

  3. 변수 method이 함수에 속해있어서 "Mclust"을 어떻게 얻을 수 있습니까?

+0

3 번 질문의 의미를 명확히 할 수 있습니까? 'MClust' 기호를 문자로 해석 하시겠습니까? 사용자가 그것을 인용하지 않고도'MClust'에 입력 할 수있게하고 싶습니까? – BrodieG

+0

사실 모든 질문에 답했습니다. 내가 원하는 것은''method''에 할당 된''MClust'' 문자열을 얻는 것입니다. – carlesh

답변

2

는 함수 호출의 ... 참여하고 여러 계층이있을 때 어떻게 match.call 작품 몇 가지 문제가 있습니다. 이것은 match.call 어휘 스택을 검색하여 다이나믹 스택 대신 대체 할 ...을 찾습니다.

devtools::install_github("brodieg/matchcall") # <-- the package in question 
library(matchcall) 
setMethod(
    f = "meth1", 
    signature = "AClass", 
    definition = function(object, method, ..., warnings = TRUE) { 
    # ... 
    print(match.call()) 
    print(match_call()) 
    print(match_call(2)) 
    return(NA) 
    }) 
meth1(new("AClass"), method = Mclust) 

가 생산 :

.local(object = object, method = ..1)    # match.call 
.local(object = object, method = Mclust)   # match_call(), my package 
meth1(object = new("AClass"), method = Mclust)  # match_call(2), my package offset 
[1] NA 

을 그래서 결국 이어질 호출의 순서가 있기 때문에, 질문이 당신이 .local입니다 얻을 이유를 대답 나는이 문제를 해결하려고하는 패키지를 썼다 당신이 정의한 기능의 평가에, S4는 그 기능을 .local으로 저장합니다.

질문 1에 대한 답변은 복잡하지만 내 패키지에 포함 된 vignette의 세부 정보를 볼 수 있습니다.

기능에 대한 평가 프레임은 초기에 검색된 호출의 이름 값 쌍을 포함 리콜, 따라서 : 내부적 C 코드 ... 인수 등 이름 ..1, ..2 (R Internals에서 )을 유의 이것은 또한 사실 일 것입니다. ...의 값은 DDVAL 비트가 설정된 특수 기호 ..1, ..2, ...에 의해 요소가 참조되는 (특수) 쌍 목록입니다. 이들 중 하나가 발견되면 ddfindVar를 통해 조회됩니다)를 평가 프레임의 ... 기호 값으로 변환합니다.

질문 3, 나는 그것을 이해하지 못한다. 따옴표 붙지 않은 변수를 "method"인수로 넣을 수 있고 그것을 문자로 해석하고 싶습니까?

패키지는 현재 github에만 있지만, 사용자의 필요에 맞게 sys.calls을 사용할 수 있습니다.우리는 당신의 방법에서 print(sys.calls())를 실행하는 경우 예를 들어, 우리가 얻을 :

[[1]] 
meth1(new("AClass"), method = Mclust) 

[[2]] 
meth1(new("AClass"), method = Mclust) 

[[3]] 
.local(object, ...) 

당신은 잠재적으로 직접 작업 할 수 있지만, 이것은 단지 아니라 완전히 호출에 인수 이름을 지정하는 것이 제대로 동작 할 것이다 (누군가가 않습니다 즉 경우 meth1(x, "blah")이면 method= 부분이 sys.calls이되지 않습니다. 인수가 여러 개이거나 부분적으로 지정된 인수 (예 : meth=X) 인 경우 물건을 일치시키기 위해 더 많은 작업을해야합니다 (정확히 match_call의 내용입니다).