programing

R 스크립트 라인 번호를 오류로 가져오는 방법은 무엇입니까?

padding 2023. 9. 5. 19:45
반응형

R 스크립트 라인 번호를 오류로 가져오는 방법은 무엇입니까?

R(R 스크립트 실행 중)R --slave script.R), 그렇다면 오류가 발생했을 때 라인 번호를 알려주도록 하려면 어떻게 해야 합니까?

가능하면 스크립트에 디버그 명령을 추가하고 싶지 않습니다. R이 다른 대부분의 스크립트 언어처럼 동작하기를 원합니다.

이렇게 하면 회선 번호는 제공되지 않지만 통화 스택에서 오류가 발생하는 위치를 알 수 있으므로 매우 유용합니다.

traceback()

[편집:] 명령줄에서 스크립트를 실행할 때 한 두 호출을 건너뛰어야 합니다. 대화형비대화형 R 세션은 traceback()을 참조하십시오.

일반적인 디버깅 의심자 없이 이 작업을 수행할 수 있는 다른 방법을 모르겠습니다.

  1. 디버그 »
  2. 브라우저 »
  3. options(error=details) [이를 되돌리려면 options(오류 = NULL)에 의해 처리됨]

당신은 이 관련 게시물을 보는 것이 좋을 것입니다.

[편집:] 죄송합니다...방금 당신이 명령 줄에서 이것을 실행하는 것을 보았습니다.이 경우 옵션(오류) 기능을 사용하는 것이 좋습니다.다음은 간단한 예입니다.

options(error = quote({dump.frames(to.file=TRUE); q()}))

오류 조건에서 원하는 만큼 정교한 스크립트를 만들 수 있으므로 디버깅에 필요한 정보를 결정해야 합니다.

그렇지 않으면 데이터베이스 연결과 같은 특정 영역이 있는 경우 tryCatch() 함수로 묶습니다.

하고있다options(error=traceback)에서는 오류로 이어지는 줄의 내용에 대한 자세한 정보를 제공합니다., 의 경우 앞에 번호가 , 에 라인 번호가 .#하지만 성공하든 실패하든, 많은 오류는 라인 번호를 얻지 못합니다.

이에 대한 지원은 R 2.10 이상에서 제공될 예정입니다.Duncan Murdoch는 2009년 9월 10일에 findLineNum에 대해 R-devel에 게시하고 Breapoint를 설정했습니다.

디버깅을 돕기 위해 R-devel에 몇 가지 기능을 추가했습니다.findLineNum()코드의 . 어떤 함수행 코의특 행해지 는하찾 습니다 당에정 이드의 소스▁finds▁cor다 니습▁which찾 ▁of▁function지는하▁code당해▁line.setBreakpoint()의 .findLineNum 및호라고 부릅니다.trace()중단점을 설정할 수 있습니다.

코드에 소스 참조 디버그 정보가 있어야 합니다.이 값은 다음 사용자가 읽은 코드의 기본값입니다.source()하지만 포장용은 아닙니다.코드에서 변수를 합니다.R_KEEP_PKG_SOURCE=yesR 에서 또R에서, 집합을 합니다.options(keep.source.pkgs=TRUE)그런 다음 소스 코드에서 패키지를 설치합니다.읽어주세요?findLineNum검색을 전역 환경으로 제한하는 대신 패키지 내에서 검색하도록 지시하는 방법에 대한 자세한 내용을 확인할 수 있습니다.

예를들면,

x <- " f <- function(a, b) {
             if (a > b)  {
                 a
             } else {
                 b
             }
         }"


eval(parse(text=x))  # Normally you'd use source() to read a file...

findLineNum("<text>#3")   # <text> is a dummy filename used by
parse(text=)

인쇄됩니다.

 f step 2,3,2 in <environment: R_GlobalEnv>

그리고 당신은 사용할 수 있습니다.

setBreakpoint("<text>#3")

중단점을 설정할 수 있습니다.

코드에는 여전히 몇 가지 제한 사항(그리고 아마도 버그)이 있습니다. 저는 그것들을 수정할 것입니다.

설정하여 수행합니다.

options(show.error.locations = TRUE)

저는 왜 이 설정이 R에서 기본값이 아닌지 궁금합니다.다른 모든 언어에서 그렇듯 그래야 합니다.

치명적이지 않은 오류를 처리하기 위한 글로벌 R 옵션을 지정하는 것이 효과적이었고 오류에 대한 정보를 유지하고 실패 후 이 정보를 검토하기 위한 맞춤형 워크플로우도 저에게 도움이 되었습니다.현재 R 버전 3.4.1을 실행하고 있습니다.아래에는 R에서 글로벌 오류 처리 옵션을 설정하는 데 사용한 코드와 함께 제가 사용한 워크플로우에 대한 설명이 포함되어 있습니다.

내가 구성한 대로 오류 처리는 오류 발생 시 작업 메모리에 있는 모든 객체가 포함된 RData 파일도 생성합니다.는 이덤는다사로다시여다있수니습읽을 사용하여 수 .load()을 사용하여 대화식으로 검사할 수 .debugger(errorDump).

나는 라인 번호를 얻을 수 있었다는 것을 기록할 것입니다.traceback() 사용자 되지만, " " " " " " " " (" " " " " " " " " " (" " " " " " 을 됩니다.keep.source=TRUE할 때 옵션 시옵션을 호출할 때 source()내 스크립트에 사용되는 모든 사용자 지정 함수에 대해 설명합니다.하지 않으면 하면 이옵션사않아같오글처다옵의 전체 이 됩니다.traceback()이 " 라이는에로그"인 오류 error.log하지만 라인 번호를 사용할 수 없습니다.

다음은 워크플로우에서 수행한 일반적인 단계와 비인터랙티브 R 장애 후 메모리 덤프 및 오류 로그에 액세스하는 방법입니다.

  1. 명령줄에서 호출하던 주요 스크립트의 맨 위에 다음과 같이 입력했습니다.R 세션에 대한 글로벌 오류 처리 옵션을 설정합니다.나의 주 대본은 불렸습니다.myMainScript.R코드의 다양한 행에는 자신이 수행하는 작업을 설명하는 주석이 있습니다.시켜 R이 트리거하는 오류가 할 때 R이 발생합니다.stop()됩니다.~/myUsername/directoryForDump 또한 로그인 과같이오로작다성니합그도류다음름의은을 할 입니다.error.log같은 디렉토리에 유용한 정보를 제공합니다.이 스니펫을 수정하여 오류 시 다른 처리(예: 덤프 파일 및 오류 로그 파일 이름에 타임스탬프 추가 등)를 추가할 수 있습니다.

    options(error = quote({
      setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths.
      dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session.
      sink(file="error.log"); # Specify sink file to redirect all output.
      dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file.
      cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace.
      cat('\nTraceback:');
      cat('\n');
      traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls.
      sink();
      q()}))
    
  2. 그호출에서 가 될 " " " " " " " " " " 을 사용할 수 있는지 합니다.keep.source=TRUE사용됩니다.즉, 함수를 소스화하려면 다음을 사용합니다.source('~/path/to/myFunction.R', keep.source=TRUE)이는 다음과 같은 경우에 필요합니다.traceback()라인 번호를 포함하는 출력입니다.다음을 사용하여 이 옵션을 전체적으로 설정할 수도 있습니다.options( keep.source=TRUE )번호가하지 않으면옵션할 수 .라인 번호가 필요하지 않으면 이 옵션을 생략할 수 있습니다.

  3. 에서 메인 를 배치 합니다.Rscript myMainScript.R 하면 R 이 시작되고 "R"이 실행됩니다.myMainScript.R된 코드 으로, 1단계의 맨 입니다.myMainScript.R비 대화형 R 세션에 대한 오류 처리 옵션을 설정합니다.
  4. 의 실행 내 어딘가에서 오류가 발생합니다.myMainScript.R이것은 주 스크립트 자체에 있을 수도 있고 여러 함수를 중첩할 수도 있습니다.오류가 발생하면 1단계에서 지정한 대로 처리가 수행되고 R 세션이 종료됩니다.
  5. 이름이 "RData"인 입니다.errorDump.rda 오류 이름이 " " 입니다."입니다.error.log는 에의지디생에성으로 지정된 됩니다.'~/myUsername/directoryForDump'글로벌 오류 처리 옵션 설정에 있습니다.
  6. 시간이 있을 때 검사합니다.error.log오류 메시지 자체 및 오류로 이어지는 전체 스택 추적을 포함하여 오류에 대한 정보를 검토합니다. 시 의 예는 . 오류 발생 시 다음 하십시오. 다음 뒤의 숫자를 기록하십시오.#문자는 콜 스택의 다양한 지점에 있는 오류의 라인 번호입니다.

    Error in callNonExistFunc() : could not find function "callNonExistFunc"
    Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF
    
    Traceback:
    3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304
    2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352
    1: test_multi_commodity_flow_cmd(config_file_path = config_file_path, 
    spot_file_path = spot_file_path, forward_file_path = forward_file_path, 
    data_dir = "../", user_dir = "Output", sim_type = "spot", 
    sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw", 
    nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31", 
    compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes, 
    overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime, 
    ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0)
    
  7. 여유가 있을 때 로드할 수 있습니다.errorDump.rda 사여대화이동을 사용하여 대화형 R 합니다.load('~/path/to/errorDump.rda')되면 로가완호출면되로 하십시오.debugger(errorDump)활성 환경에서 메모리의 모든 R 개체를 탐색합니다.R에 R 하십시오.debugger()더 자세한 정보를 참조하십시오.

이 워크플로는 명령줄에서 비대화형 R 세션이 시작되고 예기치 않은 오류에 대한 정보를 유지하려는 특정 유형의 프로덕션 환경에서 R을 실행할 때 매우 유용합니다.오류 발생 시 작업 메모리를 검사하는 데 사용할 수 있는 파일에 메모리를 덤프하는 기능과 함께 오류가 발생한 원인에 대한 사후 디버깅을 신속하게 수행할 수 있습니다.

첫째번.options(show.error.locations = TRUE)그리고 나서.traceback()는 # 라인 번호 #오류 라인 번호뒤에 됩니다.

언급URL : https://stackoverflow.com/questions/1445964/how-to-get-r-script-line-numbers-at-error

반응형