2014-03-02 1 views
20

함수의 소스 코드를 보는 방법은 definitive guide입니다.하지만 찾은 소스 코드를 수동으로 실행하지 않고 패키지에서 내 보낸 함수를 어떻게 디버깅합니까? 내가 사용했던수출되지 않은 기능을 디버깅하는 방법은 무엇입니까?

library(plm) 
> predict.plm 
Error: object 'predict.plm' not found 
> plm:::predict.plm 
function (object, newdata = NULL, ...) 
{ 
    tt <- terms(object) 
    if (is.null(newdata)) { 
     result <- fitted(object, ...) 
    } 
    else { 
     Terms <- delete.response(tt) 
     m <- model.frame(Terms, newdata) 
     X <- model.matrix(Terms, m) 
     beta <- coef(object) 
     result <- as.numeric(crossprod(beta, t(X))) 
    } 
    result 
} 
<environment: namespace:plm> 
> debugonce("predict.plm") 
Error in debugonce("predict.plm") : could not find function "predict.plm" 
> debugonce("plm:::predict.plm") 
Error in debugonce("plm:::predict.plm") : 
    could not find function "plm:::predict.plm" 
+2

(+1)이 분명하지만, 전혀가요 내가 현재 R 확장을 작성하는 것을 배우고 있기 때문에 위대한 (그리고 유용한) 질문이다. 고마워! –

답변

12

그것은, 상징으로보다는 인용 된 문자열이 잘 작동하는 것 같다 등의 인수를 포기 즉

debugonce(plm:::predict.plm) 

보다는

debugonce("plm:::predict.plm") 
+2

''fun = ""어떤 것이 실제로 작동하는지 꽤 충격적입니다. 왜냐하면'? debug'는'fun'가 함수라고 가정하기 때문입니다. 'fun'를 문자열로 설정하려고하지는 않았습니다. –

+0

@ doucall을 호출하면 @JoshuaUlrich가 나를 당황하게했습니다. 합격 기능은 매우 unrilike 느낌의 현입니다. –

+0

카운터 인수 : 함수를 전달하면 원래 함수가 호출 될 때마다 디버그가 보일 위치와 개입 위치가 알려지기보다는 해당 내용이 복사 (값 전달)된다는 것을 의미합니다. 분명히 인용 부호가 붙지 않는 것은 올바른 방법이지만 여기서 더 직관적이거나 R과 같은 것은 확실하지 않습니다. –

7

한 트릭은 지역 오브젝트를 먼저 할당하는 것입니다 :

predict.plm <- plm:::predict.plm 

된 후 fix(), debug() ... 로컬 복사본을 할 수 있습니다.

+5

상황에 따라 (즉, 함수가 패키지 함수 내에서 호출되는 경우) 패키지 내의 함수가 NAMESPACE의 버전을 로컬 복사본이 아닌 처음으로 볼 수 있기 때문에 문제가 발생할 수 있다고 상상할 수 있습니다. –

+0

비슷한 것을하고있는 문제를 해결했습니다 (로컬 오브젝트에 복사/붙여 넣기). –

+0

예, 저 역시 그렇게했습니다. 그리고 종종 나는 로컬 접두어를 붙인다. 예를 들어'mypredict'는 @BenBolker가 암시 한 이름 충돌을 극복 할 것이다. –

관련 문제