2013-04-01 2 views
13

lapply을 사용하여 비슷한 기능의 목록을 만들려고 할 때 목록의 모든 기능이 동일하고 최종 요소의 기능과 동일하다는 것을 알게되었습니다. 당신은 당신이 동일한 결과를 얻을 이러한 기능을 평가하려고 할 때lapply에서 익명의 함수 반환 - 무슨 문제가 있습니까?

pow <- function(x,y) x^y 
pl <- lapply(1:3,function(y) function(x) pow(x,y)) 
pl 
[[1]] 
function (x) 
pow(x, y) 
<environment: 0x09ccd5f8> 

[[2]] 
function (x) 
pow(x, y) 
<environment: 0x09ccd6bc> 

[[3]] 
function (x) 
pow(x, y) 
<environment: 0x09ccd780> 

:

는 다음 사항을 고려

pl[[1]](2) 
[1] 8 
pl[[2]](2) 
[1] 8 
pl[[3]](2) 
[1] 8 

여기에 가고, 어떻게 내가 (내가 원하는 결과를 얻을 수있는 것 목록의 올바른 기능)?

+0

나는 확실하지 않다가, 당신의 목표는 무엇인가. 아마도'pl <- function (x, y) lapply (y, function (y) pow (x, y)); pl (2,1 : 3)'? – Roland

+0

Ross Ihaka (RCore)의이 노트 (특히 Lazy Evaluation에 대한 부분)가 도움이 될 수 있습니다. www.stat.auckland.ac.nz/~ihaka/downloads/Waikato-WRUG.pdf –

+0

R 3.2.0, 내 대답은 아래 참조하십시오. – jhin

답변

20

R은 값 자체가 아니라 promises입니다. 약속은 통과 될 때가 아니라 처음 평가 될 때 강제되며, 그 때까지는 질문에 코드를 사용하면 색인이 변경됩니다.

pl <- lapply(1:3, function(y) { force(y); function(x) pow(x,y) }) 
+0

감사합니다.이 함정이 어떻게 작동하는지 알고있는 것이 좋습니다. 나는 이것을 명심해야한다. – James

4

이 더 이상 R 3.2.0의 진실한 없습니다 : force에 외부 익명 함수가 호출되고 분명히 독자에 확인하기 위해 시간에 약속을 다음과 같이 코드를 작성할 수 있습니다!

change log의 해당 줄을 읽 같은 기능을 적용하고 게으른 평가 사이 바람직하지 않은 상호 작용을 제거하기 위해 적용되는 함수) (지금 힘 인수를 줄뿐만

높은 주문 기능 가변 캡쳐 을 폐쇄합니다.

그리고 실제로 :

pow <- function(x,y) x^y 
pl <- lapply(1:3,function(y) function(x) pow(x,y)) 
pl[[1]](2) 
# [1] 2 
pl[[2]](2) 
# [1] 4 
pl[[3]](2) 
# [1] 8 
+0

그것은 좋은 소식입니다. – James

관련 문제