2011-08-25 2 views
5

필자가 작성하지 않은 코드 (plot.gam in mgcv)를 이해하려고하는데, 내가 인식하지 못하는 이상한 매개 변수 (예 : "P")가있는 plot() 함수가 필요합니다. . 나는이 호출에 어떤 플롯 메서드가 전달되는지 알아 내고 싶습니다. findMethod()와 유사한 함수는 도움이되지 않습니다 (저는 플롯이 S3라고 생각합니다). 디버그 라이브러리를 시도했지만 함수 호출을 "수행"하지 못하게합니다 (기본 디버그 함수도 수행하지 않습니다).R에서는 특정 함수 호출에 대해 어떤 메소드가 디스패치되는지를 어떻게 알 수 있습니까?

R에서 모든 함수 호출과 관련 메서드 디스패치를 ​​모니터링하는 방법이 있습니까? 아니면 실제 함수 호출 (서명뿐만 아니라)을 포함하는 문자열을 전달할 수있는 함수로 어떤 메소드가 전달되는지 알려줄 수 있습니까?

+0

그냥 제쳐두고. . . 함수 호출에서 매개 변수를 지정할 때 매개 변수의 이름을 명확하게자를 수 있습니다. 따라서 서명에'P'가있는 _starts_ 매개 변수가 하나만 있으면'P ='로 그 매개 변수를 지정할 수 있습니다. 이것은 귀하의 질문에 대답하지 않으므로 그것은 단순한 논평입니다. – adamleerich

답변

5

우리는 plot()이 클래스의 객체 인 x$smooth[[i]]에서 호출 참고 :이

class(x$smooth[[i]]) 
[1] "tprs.smooth" "mgcv.smooth" 

클래스 "mgcv.smooth"위한 plot() 방법이며 줄거리에 사용되고 있음이있다 일반적인 경우. methods()은 어떤 이유로

For smooth terms ‘plot.gam’ actually calls plot method functions 
depending on the class of the smooth. Currently random effect and 
Markov random field smooths have special methods, the rest use the 
defaults described below. 

: ?plot.gam이 가장 부드럽게에 사용되는 기본 방법이라고 언급하지만, ?plot.gam의 세부 사항 섹션에서 gam() 지원 부드러운 특정 유형의 구체적인 방법은 (이 있습니다 이러한 방법을 발견,하지만 그들은 존재하지 :

> mgcv:::plot.mgcv.smooth 
function (x, P = NULL, data = NULL, label = "", se1.mult = 1, 
    se2.mult = 2, partial.resids = FALSE, rug = TRUE, se = TRUE, 
    scale = -1, n = 100, n2 = 40, pers = FALSE, theta = 30, phi = 30, 
    jit = FALSE, xlab = NULL, ylab = NULL, main = NULL, ylim = NULL, 
    xlim = NULL, too.far = 0.1, shade = FALSE, shade.col = "gray80", 
    shift = 0, trans = I, by.resids = FALSE, scheme = NULL, ...) 
{ 
.... 

이이 표시되지 않은 plot.function을 의미 methods()의 버그에 관련이있을 수 있습니다 n 목록에 있고 현재의 R에 해당 수정 사항이 통합되어 있지 않을 수도 있습니다. 이 방법은 정상적으로 보여 져야하며, 그러한 상황에서 일반적인 조언은 객체 클래스를 식별하고 (위의 그림과 같이) methods() 및 유사한 함수 (예 : showMethods())를 사용하여 클래스에 사용할 수있는 특정 메소드) 반환 된 개체의.

+0

네, 그건 제 문제였습니다. 그것은 메소드()에 나타나지 않았습니다. 하지만이 말이 맞습니다 - 고마워요! – dan

2

S3 클래스의 경우 methods("plot")은 특정 기능에 대해 정의 된 모든 메소드를 제공합니다. S3 디스패치에서 호출 된 호출은 첫 번째 인수의 클래스를 기반으로합니다. plot.gam을 보면, 당신이 묻는 부분은 plot(x$smooth[[i]])이므로, 메쏘드가 무엇인지를 결정하기 위해 x$smooth[[i]] 클래스가 무엇인지 (여기서 x은 객체 gam 객체 임) 볼 필요가 있다고 가정합니다.

자동으로 수행하는 방법을 모르겠습니다.

+0

나는 이것을 정확하게 시도했다. x $ smooth [m]가 mgcv.smooth 클래스인지는 알지만, S3 클래스를 사용하여 어떻게 plot()이 전달되는지 알 수있는 방법을 알 수 있습니다. methods() 호출에서 튀어 나오는 특별한 것은 없습니다. 이것이 S4라면 getMethod()와 클래스 서명과 같은 것이 작동 할 것이다. 그러나 S3 방법으로 무엇을해야할지 모르겠습니다.(필자는 모든 플롯 기능을 수동으로 검사했는데 아무 것도 제대로 보이지 않았습니다.) – dan

+0

Typo :'method'가 아니라'method'. –

+0

@ 홍콩, 감사합니다. 결정된. –

0

함수 내부에서 개체의 클래스를 인쇄하십시오. 함수를 해킹하거나 trace()를 사용하십시오. plot.gam()에서

관련 문제