2014-10-25 3 views
2

내가 이런 식으로 생각하고있다 : 당신이 그들을 해제 할 때 당신에게, 단지R에서 전역으로 디버그 메시지를 켜고 끕니까?

rm(debugging) 

문제를

> fx = function(x, y) { 
+  if (exists("debugging")) { 
+   print(x) 
+   print(y) 
+  } 
+  x+y 
+ } 
> fx(1, 2) 
[1] 3 
> debugging = 1 
> fx(2, 3) 
[1] 2 
[1] 3 
[1] 5 

당신이 원하는대로 당신은 많은 디버깅 메시지를 쓸 수있는이 방법, 및 변수 디버깅 (또는 사용자가 지정한 이름)은 언제든지 다른 패키지에서 제거하거나 만들 수 있으므로 제어가 어렵습니다. 어떤 아이디어?

+1

관련 항목 : 몇개의 클로저에 대해서'debug'를 on으로했을 경우,'debug'가 액티브 한 모든 클로우즈를 식별하기 위해서 is.debugged (cgwtools : lstype())를 사용할 수 있습니다. 그리스트에서'undebug'를 실행하십시오. –

답변

4

또 다른 옵션은 패키지에 debugging 함수를 정의하는 것입니다 :

debugging <- local({ 
    stored.value <- FALSE 
    function(bool = NULL) 
     if (is.null(bool)) { 
     stored.value 
     } else { 
     stopifnot(is.logical(bool), length(bool) == 1L) 
     stored.value <<- bool 
     } 
}) 

# default value: 
debugging() 
# [1] FALSE 

# set value 
debugging(TRUE) 

# check value 
debugging() 
# [1] TRUE 

"나중에 패키지 이름을 변경하면 어떻게됩니까?" 나는 생각한다.

6

옵션을 사용하십시오. xyz이 패키지의 이름 인 경우 일반적인 함수의 디버깅 코드는이 작업을 수행 할 것입니다 :

if (getOption("xyz.debug", FALSE)) { print(x); print(y) } 

을 다음이 디버깅을 할 수있는 패키지 문제를 외부 :

options(xyz.debug = TRUE) 

을하거나 그것을 해제 :

options(xyz.debug = FALSE) # or options(xyz.debug = NULL) 

다른 패키지에는 옵션 이름 앞에 패키지 이름이 붙지 않습니다.

이 방법의 주요 장점은 매우 가볍고 만드는 if (...) ... 문 및 디버깅이 꺼져있는 경우에 사용을위한 오버 헤드가 getOption에 단지 if 및 전화보다가 다른 어떤 인프라를 필요로하지 않는다는 점이다.

+0

차가움. 나중에 패키지 이름을 변경하기로 결정한 경우 어떻게해야합니까? 패키지 이름을 추론 할 수있는 방법이 있습니까? 이것은 어떤 종류의 전처리를 요구하는 것 같습니다. – qed

+1

'.onLoad' 함수가있는 경우 ('? .onLoad' 참조) 패키지 이름을 인수로 전달하여 패키지에 저장 한 다음 추가 코드가 적절한 옵션 이름을 가져올 수 있지만 실제로는 나는 이것이 과잉이라고 생각한다. 그리고 실제로 몇 번이나 패키지 이름을 바꾸면, 그런 경우에 적절한 편집기를 사용하여 대체 할 수있다. –

-1

그냥 기록을 위해, 여기에 내가 G.Grothendieck의 대답 @ 읽고 해낸 것입니다 :

dbgexec = function(cmd) { 
    command = substitute(cmd) 
    if(getOption("mypack.debug", FALSE)) eval(cmd, parent.frame()) 
    invisible(NULL) 
} 

예 :

> x = 1.1111 
> dbgexec({message("value of x: "); print(x)}) 
value of x: 
[1] 1.1111 
> options(mypack.debug = FALSE) 
> dbgexec({message("value of x: "); print(x)}) 
# nothing done here 

그리고 @ flodel의 대답과 실험 :

> debugging <- local({ 
+ stored.value <- FALSE 
+ function(bool = NULL) 
+  if (is.null(bool)) { 
+   stored.value 
+  } else { 
+   stopifnot(is.logical(bool), length(bool) == 1L) 
+   stored.value <<- bool 
+  } 
+ }) 
> 
> 
> dbgexec = function(cmd) { 
+  command = substitute(cmd) 
+  if(debugging()) eval(cmd, parent.frame()) 
+  invisible(NULL) 
+ } 
> 
> x = 1; y = 2 
> dbgexec({x <- 2; y <- 3; print(x + y)}) 
> x 
[1] 1 
> y 
[1] 2 
> debugging() 
[1] FALSE 
> debugging(TRUE) 
> dbgexec({x <- 2; y <- 3; print(x + y)}) 
[1] 5 
> x 
[1] 2 
> y 
[1] 3 
+0

여기서'substitute()'와'eval()'이 필요 없습니다 - 당신은 규칙적인 게으른 평가에만 의존 할 수 있습니다. – hadley

+0

몇 가지 힌트를 주시겠습니까? 나는 아직도 게으른 평가로 그것을하는 방법에 대한 단서가 없다. – qed

+1

'dbgexec = function (cmd) if (getOption ("mypack.debug", FALSE)) cmd' – hadley

관련 문제