2015-01-25 2 views
2

Hadley의 Advanced R에서이 예제를 발견했습니다. 내 질문은 함수를 정의한 후, j (1)은 j (1)()이 출력하고있는 것으로 가정 된 내부 함수 정의를 출력합니까? 직관적으로, 난 j (1) 출력해야한다고 생각합니다 [1] 1 2R 함수의 이름 마스킹 - Hadley의 Advanced R

아무도 실제로 무슨 일이 일어나고 있는지 설명 할 수 있을까요? j (1)과 j (1)()의 차이점은 무엇입니까?

> j <- function(x) { 
+ y <- 2 
+ function() { 
+  c(x,y) 
+ } 
+ } 

> k <- j(1) 

> k() 
[1] 1 2 

> j(1) 
function() { 
    c(x,y) 
    } 
<environment: 0x7fa184353bf8> 

> j() 
function() { 
    c(x,y) 
    } 
<environment: 0x7fa18b5ad0d0> 

> j(1)() 
[1] 1 2 

답변

6

TL; R에서 DR는 함수의 리턴 값도 기능 할 수있다. 그게 여기에 해당됩니다. j(1)은 함수를 반환하고 j(1)()은 숫자 벡터를 반환합니다.


j(1)j(1)()과의 차이는 그 j 정의 마지막 값이기 때문에 j(1) 함수를 출력한다. 함수는 마지막 표현 (또는 관련 return() 호출에서 발견 된 값)을 반환합니다.이 경우 함수이기도합니다. j(1)()은 마지막 값인 j을 호출하는데, 이는 반환 된 함수입니다. 빈 괄호 ()j(1)

에 대한 인수 목록은 우리가 가까이 j에서 모양과 속성의 일부가 있다면 그것은 조금 더 명확하게 할 수있다, 그래서 그것은 인수를하지 않습니다.

j <- function(x) { 
    y <- 2 
    function() { 
     c(x, y) 
    } 
} 

우리는 클래스를 볼 때 호출 간의 차이가 아주 분명해진다. 벡터의 두 번째 값 그 함수에서 반환하면 j 정의

class(j(1)) 
# [1] "function" 
class(j(1)()) 
# [1] "numeric" 

2 하드 코딩의 함수로 리턴한다. 우리는 그래서 j(1)() (또는 k())에 대한 호출이 벡터 c(1, 2)을 제공합니다

library(pryr) 
unenclose(j(1)) 
# function() 
# { 
#  c(1, 2) 
# } 

으로 j(1)에 대한 호출의 정확한 리턴 값을 볼 수 있습니다. 우리가 j(5) 호출하는 경우 마찬가지로, j(5)()의 반환 값은 도움이 c(5, 2)

unenclose(j(5)) 
# function() 
# { 
#  c(5, 2) 
# } 

희망입니다.

unenclose() 기능 (주석 삭제됨)을 언급 한 것에 대해 @Khashaa에게 제공됩니다.