문제

내가 방금 함수라고 불렀다고 가정 해 봅시다. 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(). 오류가 발생한 후에 바로 전화하면 버그를 정확히 찾아 내기에 충분합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top