문제
내가 방금 함수라고 불렀다고 가정 해 봅시다. f
, 그리고 기능 어딘가에 오류가 발생했습니다. 오류가 발생하기 직전에 다른 변수의 값을 확인할 수 있기를 원합니다.
내 직감이 작은 벌레라고 말해서 사용하기에는 너무 게으르다 고 가정 해 debug(f)
그리고 삽입하기에는 너무 게으르다 browser()
내가 잘못되고 있다고 생각하는 기능의 일부로. 그리고 나는 들어가기 시작하기에는 너무 게으르다 print()
진술.
예는 다음과 같습니다.
x <- 1:5
y <- x + rnorm(length(x),0,1)
f <- function(x,y) {
y <- c(y,1)
lm(y~x)
}
부름 f(x,y)
다음 오류가 발생합니다.
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) :
variable lengths differ (found for 'x')
이 예에서는 직전에 환경의 상태를 잡고 싶습니다. lm()
호출됩니다. 그렇게하면 전화 할 수 있습니다 x
그리고 y
그리고 그들의 길이가 다르다는 것을 알 수 있습니다. (이 예제는 너무 간단 할 수 있지만 아이디어를 가로 질러 있기를 바랍니다.)
해결책
지적한대로 여기,이 작업을 수행하는 쉬운 방법이 있으며,이 트릭은 더 나은 삶을 변화시킬 수있는 잠재력이 있다고 생각합니다.
먼저 전화하십시오.
options(error=recover)
이제 우리가 전화 할 때 f(x,y)
복구 할 환경을 선택할 수있는 옵션이 있습니다. 여기서 나는 디버거를 열고 직전 변수를 가지고 놀 수있는 옵션 1을 선택합니다. lm()
호출됩니다.
> f(x,y)
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) :
variable lengths differ (found for 'x')
Enter a frame number, or 0 to exit
1: f(x, y)
2: lm(y ~ x)
3: eval(mf, parent.frame())
4: eval(expr, envir, enclos)
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE)
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)
Selection: 1
Called from: eval(expr, envir, enclos)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000
다른 팁
Debug () 함수 만 사용할 수도 있습니다.
> debug(f)
> f(x,y)
debugging in: f(x, y)
debug: {
y <- c(y, 1)
lm(y ~ x)
}
Browse[1]>
debug: y <- c(y, 1)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 2.146553 2.610003 2.869081 2.758753 4.433881
options(error=recover)
아마도 질문에 가장 잘 대답 할 것입니다. 그러나 또 다른 편리한 디버깅 도구를 언급하고 싶었습니다. traceback()
. 오류가 발생한 후에 바로 전화하면 버그를 정확히 찾아 내기에 충분합니다.