2016-11-04 2 views
3

나는이 오류를 유발하고 사용하는 모든 프레임의 덤프를 기록 다음 코드 dump.frames()proposed e. g. by Hadley Wickham 등 :R :) (dump.frames을 디버거() 나중에 사후 디버깅을위한 모든 변수를 포함하는 방법

a <- -1 
b <- "Hello world!" 
bad.function <- function(value) 
{ 
    log(value)     # the log function may cause an error or warning depending on the value 
} 

tryCatch({ 
      a.local.value <- 42 
      bad.function(a) 
      bad.function(b) 
      }, 
      error = function(e) 
      { 
      dump.frames(to.file = TRUE) 
      }) 

나는 R 세션을 다시 시작하고 내 변수 (A, B, a.local.value)도 어디서나 내 기능 "bad.function"를 찾을 수 없습니다

load(file = "last.dump.rda") 
debugger(last.dump) 

를 통해 문제를 디버깅 할 덤프를로드 할 때 프레임에.

이렇게하면 덤프가 거의 쓸모 없게됩니다.

내 모든 변수와 기능을 알기 위해해야 ​​할 일 부검 분석?

debugger의 출력은 :

> load(file = "last.dump.rda") 
> debugger(last.dump) 
Message: non-numeric argument to mathematical functionAvailable environments had calls: 
1: tryCatch({ 
    a.local.value <- 42 
    bad.function(a) 
    bad.function(b) 
2: tryCatchList(expr, classes, parentenv, handlers) 
3: tryCatchOne(expr, names, parentenv, handlers[[1]]) 
4: value[[3]](cond) 

Enter an environment number, or 0 to exit 
Selection: 

PS : 나는 디버깅 RStudio R3.3.2으로 사용하고 있습니다.

+0

선택 한 다음 할'의 LS (parentenv)'또는'수 ("a.local.value", ENV = parentenv) '을 참조하십시오. –

+0

스트라이크, 지역 변수를 얻는 것은 그런 식으로 작동합니다. 덤프의 다른 프레임에 포함 된 모든 환경을 탐색 할 때 찾을 수없는 것은 전역 변수와 함수입니다. 이상하게 ...'.GlobalEnv'는'dump.frames'에 포함되지 않은 것처럼 보입니다. –

+0

아마도 덤프 된 .rda 파일에 추가 변수를 추가 할 수 있습니까? –

답변

1

참고. 문서화 된대로 정확하게 동작하므로 분명히 버그가 없습니다.당신이 (LARGE 수 있습니다) 작업 공간에 대한 전체 액세스 권한을 가지고 (당신이 언급 한대로) 문제는 일괄 작업에 적용 있도록,이 대화 형 작업하는 경우

또한 문제가 없습니다.

은 우리가 아니라 여기있는 것은 일반적으로하지만를 읽은 후 없는 기능 및 기능 요청 (및 버그 리포트!)가 R 버그 사이트 (일명 _'R 버그질라 '), https://bugs.r-project.org/ ...에서 발생한다입니다 R 웹 사이트의 해당 페이지 : https://www.r-project.org/bugs.html. R 버그질라를 검색하고, 현재의 경우에, 당신은 꽤 빨리 안드레아스 KERSTING가 (즉 원하는대로가 아니라 버그를 주장하는 것보다) 멋진 제안, https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17116 를 만들어 결과적으로 내가 가진 것을 발견 거라고

주 이미 8 월 16 일 R에 누락 된 기능을 추가했다. 예, 물론 개발 버전 (R), R-devel입니다. 는 R-devel 메일 링리스트에 오늘의 스레드, https://stat.ethz.ch/pipermail/r-devel/2016-November/073378.html

+0

마틴, 실망한 기능을 검색하고 제안하는 방법을 배우는 데 도움을 주신 양해 해 주셔서 감사합니다 (나는 아직 알지 못했거나 아직 신경 쓰지 않았 음). 나는 대답을 받아 들인 것으로 표시했으며, 향후 릴리스에서 솔루션이 이미 진행 중이다. 나는 "버그"를 큰 소리로 외치며 R이나 개발자 중 일부를 비난하고 싶지 않으니 안심하십시오! –

3

업데이트 2016년 11월 20일 : 그것이 R 버그 (마틴 Maechler의 대답을 참조) 하지 것을 참고. 나는 재현 가능성에 대한 나의 대답을 바꾸지 않았다. 설명 된 문제는 여전히 적용됩니다.

요약

난 당신이 새로운 R 세션에서 일괄 처리 작업의 오류를 디버깅 할 경우 dump.frames(to.file = TRUE) 현재 R의 안티 패턴 (또는 아마 버그)라고 생각합니다.

당신은 더 나은

dump.frames() 
    save.image(file = "last.dump.rda") 

또는

options(error = quote({dump.frames(); save.image(file = "last.dump.rda")})) 

대신

options(error = dump.frames) 

로 교체해야하기 때문에 지구 환경 (.GlobalEnv = 사용자 작업 공간은 일반적으로 개체를 만들 수) 덤프 디렉토리에 저장 될 때 누락 된 동안 덤프에 포함됩니다. 예 : dump.frames(to.file = TRUE). .GlobalEnv 당신 느슨한 중요한 최상위 객체 (및 현재 값 ;-)없이

영향 분석

는 오류로 이끄는 코드의 행동을 이해하기!

특히 당신이 .GlobalEnv없이 손실됩니다"비 대화식"R 배치 작업에서 오류가 발생하는 경우에 당신은 당신이 만 호출의 개체에 액세스 할 수 있습니다 새로 시작 (빈) 대화 형 작업 공간에서 디버깅 할 수 있기 때문에 스택 프레임.

당신을 통해 평소와 같이 새로운 R 작업 공간에 오류 주도 개체 값 검사 할 수 있습니다 위의 코드를 사용하여 :

load(file = "last.dump.rda") 
debugger(last.dump) 

배경 dump.frames의 구현은 변수 last.dump에서 생성

을 작업 공간을 호출 스택의 환경으로 채 웁니다 (sys.frames(). 각 환경에는 호출 된 함수의 "로컬 변수"가 포함되어 있습니다). 그런 다음이 변수를 save()을 사용하여 파일에 저장합니다. (호출 스택)

프레임 스택 함수의 각각의 호출에 자라는 ?sys.frames 참조 :

.GlobalEnv 프레임리스트에서 번호 0이 주어진다. 각 후속 함수 평가는 프레임 스택을 1 씩 증가시키고 해당 함수를 평가하기위한 [...] 환경은 [...] sys.frame에서 적절한 인덱스와 함께 반환됩니다.

지금 질문의 코드에 의해 생성 된 덤프 디버깅을 시작하고 프레임 하나를 선택하면 .GlobalEnv 인덱스 번호 0

을 가지고 관찰 (안 0!) 나는 변수 parentenv를 볼 수 있습니다 어떤 점 (참조)를 .GlobalEnv : 따라서

Browse[1]> environmentName(parentenv) 
[1] "R_GlobalEnv" 

내가 sys.frames이 포함되지 않은 것을 믿는 .GlobalEnv 따라서 dump.frames(to.file = TRUE)하지도 않습니다 그것은 단지 sys.frames를 저장하기 때문에 .GlobalEnv의 다른 모든 객체없이

아마도 내가 틀 렸습니다. 그러나 이것은 원치 않는 효과 또는 버그처럼 보입니다. 토론 환영합니다!

참고 자료 섹션에서

https://cran.r-project.org/doc/manuals/R-exts.pdf

발췌

4.2 디버깅 R 코드 (96 페이지) :

last.dump가에서 나중에 또는 다른 R 세션에서 조회 할 수 있기 때문에 , R의 배치 사용에도 사후 검사가 가능합니다. 은 덤프를 저장하도록 준비해야합니다 : 이것은 같은

옵션을 실행의 끝에서 작업 공간을 저장하거나 설정을 통해 명령 줄 플래그 --save를 사용하여 (오류 = 인용 ({dump.frames (to.file = TRUE); 종종는 R 코어 팀보다는 R 버그를 가지고 이야기로 작업하는 것이 더 생산적이라고 Q()}))

+0

이 답변을 올린 후 상황이 변경되었는지 확실하지 않습니다. 하지만 디버거를 찾을 때 (https://stat.ethz.ch/R-manual/R-devel/library/utils/html/debugger.html),'include.GlobalEnv' 옵션이' 덤프. 프레임. 이것은 제안 된 솔루션과 동일합니까? – rensa

+1

@rensa 여기에 게시하기 전에 매개 변수'include.GlobalEnv'가 FR (https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17116)을 통해 생성되었습니다 (이 FR을 간과했습니다) . 이 매개 변수의 의미는 내 제안 된 솔루션과 다릅니다. GlobalEnv에서 변수를 가져 오려면이 매개 변수를 사용하여 덤프를 만들지 만 get ("variable.name", last.dump $ .GlobalEnv) 변수 이름을 디버거에 넣지 않고 ** 호출 스택을 "등산"하여 변수를 찾지 않습니다. 이것이 마지막으로 알려진 정보였습니다. 내 해결 방법은 실제로 변수가 GlobalEnv에서 발견되도록합니다. –

관련 문제