2014-07-15 1 views
2

여기서 무슨 일이 일어나는지 알아내는 데 도움이 필요합니다.3 개의 도트 "..."인수를 사용하는 이상한 버그

g <- function(x, y=NULL, z=NULL) invisible(NULL) 

h <- function(...) { 
    args <- as.list(match.call(g))[-1] 
    print(args) 
    ## lapply(args, eval) 
} 

f <- function(...) { 
    h(...) 
} 

기능 h()는 평가되지 않은 인수라는 이름의 목록을 인쇄하고 인수를 평가하는 을 시도합니다.

z=3z=-3을 사용하여 f을 호출하면 어떻게되는지 확인하십시오.

> f(1, z=3) 
$x 
[1] 1 

$z 
[1] 3 

> f(1, z=-3) 
$x 
[1] 1 

$z 
..2 

이것은 무엇입니까 ..2? h(1, z=-3)은 다른 출력을 생성합니다.

> h(1, z=-3) 
$x 
[1] 1 

$z 
-3 
+0

실제로 R 언어 정의의 일부일 때 이해가되지 않을 때 버그라고 부르는 것은 다소 가혹합니다. – MrFlick

답변

5

두 번째 질문은 쉽습니다. 마지막으로 호출 된 함수로 함수 내부에서 인쇄하는 부작용을 만드는 함수가 있습니다. print 함수는 인수를 값으로 반환하므로 함수가 종료하면 콘솔의 read-eval-print 비헤이비어가 다시 표시됩니다.

첫 번째 질문은 내부 동작에 대해 자세히 설명합니다. 줄임표의 항목은 ..1, ..2, ..3 등의 임시 이름을 갖습니다. 2 앞에 빼기 기호를 사용하면 실제 값을 변경하는 단항 연산자가 적용됩니다. 당신은 두 번째 인수로 log(2)와 정확히 같은 결과를 얻을 :

> f(1,log(2)) 
$x 
[1] 1 

$y 
..2 

나는 F에 2 번째의 인수가 원자 때 ..2이 나타나지 않는 이유는 생각을하는 다른 평가 과정 (또는 평가) 프로세스가 필요합니다. 같은 문제가 문자 개체에서 발생합니다.

> f(1,"a") 
$x 
[1] 1 

$y 
[1] "a" 
+0

두 번째 질문을 내 부분에서 실수로 (나는 'lapply'줄의 주석을 일시적으로 제거했다) 제거했다. –