R 기본 디버깅 (Debugging) 및 RStudio 이용


디버깅 방법은 아래와 같이 크게 2가지로 나눠 진다.

  • print(), sprint(), cat()을 사용해서 메시지나 객체의 내용을 출력해보는 방법
  • browser()를 사용한 코드 디버깅 방법


print()


print()문으로 중간 중간 데이터를 찍어 보면서 수행 하도록 한다.

paste() 함수와 같이 쓰는면 유용하다.

인자간의 공백을 사용하지 않는 함수는 paste0() 함수 이다.

fibo <- function (n) {
    if (n == 1 || n == 2) {
        print (" base case ")
        return (1)
    }
    print ( paste0 (" fibo (", n - 1, ") + fibo (", n - 2, ")"))
    return ( fibo (n - 1) + fibo (n - 2))
}
> fibo(3)
[1] " fibo (2) + fibo (1)"
[1] " base case "
[1] " base case "
[1] 2


sprintf()


print()와 유사하지만 주어진 인자들을 특정한 규직에 맞게 문자열로 변환해 출력 한다.

sprintf("포멧팅 문자열",인자1,인자2,..인자n)
# %d / %f / %s (C언어의 문법과 유사하다)


cat()


행 바꿈을 수행하지 않고 출력하는 특징이 있다.

줄바꿈 하고 싶으면 "\n"을 수행 하면 된다.


이러한 특징 때문에 cat()을 사용해서 테스트 방식의 프로그레스 상태 메시지를 보여줄 수 있다.

> sum_to_ten <- function () {
+     sum <- 0
+     cat(" Adding ...")
+     for (i in 1:10) {
+         sum <- sum + i
+         cat(i, "...")
+     }
+     cat(" Done !", "\n")
+     return (sum)
+ }
> sum_to_ten()
 Adding ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ...10 ... Done ! 
[1] 55


Cat을 이용한 또다른 디버깅 코드이다.

#for detecting error, analyze each Corpus

sapply(1:length(vTitle), function(x){

    cat(x,'...')

    sms_corpus_clean <- tm_map(sms_corpus[x], content_transformer(tolower))

    if(x%%10 == 0){

        cat('\n')

    }

})



browser()


해당 함수가 호출 되면 명령어의 수행이 중지되고, 해당 시점부터 디버깅 모드가 시작된다.

원하는 부분에다가 직접 browser() 코드를 삽입 해야한다.

그럼 해당 코드 위치에 도달 했을때

Browse[1]> 이라는 명련 표시줄로 변경이 된다.

명령어는 gdb와 대부부 같다.

n,s,c

종료는 Q 이다.


browser()만의 장점은 다음과 같다.

  • 어떠한 editor에서도 사용하다.
  • 추가적으로 conditional breakpoint의 기능을 구현할수도 있다.
for (i in 1:1024) {
  start_work()
  if (i == 512)
    browser()
  finish_work()
}



R-Studio를 이용한 디버깅 방법



아래와 같이 편집기에서 마우스로 클릭하면 breakpoint를 설정 할 수 있다.

해당 라인에서 Shift + F9를 해도 된다.


breakpoint를 설정하면 아래와 같이 걸려있는 함수를 환경변수 패널에서 확인 할 수 있다.


만약 아래와 같은 경고가 나온다면 이유는 두가지 이다.

첫 번째는 source()를 통해서 해당 파일을 읽어 들이지 않아서 그래서 object가 생성되지 않았을 때이다.

두 번째는 editor 상의 file과 source()로 읽어들인 file간의 차이가 존재 했을 때이다.


위 두상황 모두 source()를 해주면 해결 된다.



정상적으로 breakpoint를 걸었다면,

이제 해당 코드를 실행하면 원하는 위치에서 멈추는거을 알 수 있다.

R Studio는 디버깅 명령어들을 모두 위즈윅 모드로 제공하므로 마우스를 써서 디버깅 하면 된다.


디버깅 실행 화면



만약 source 코드가 없는 상태에서 디버깅 하고 싶다면?


install.packages("devtools")


참고문헌: Debugging with RStudio





+ Recent posts