0

라고 할 때까지 개체를 찾을 수 없습니다 내가 mod()를 제거하기 전에 어떤 식 으로든 sq()를 호출하는 경우, 그러나R : 폐쇄 나는 R의 고차 기능에 문제가

power <- function(x , modify){ 
    return(
     function(y){ 
     return( modify(y^x)) 
     } 
) 
} 

mod <- function(z){z+1} 

sq <- power(x = 2,modify = mod ) 

# remove the function that was passed to `power()`, I expect it to be saved in the function environment: 

rm(mod) 

sq(2) 
# Error in sq(2) : object 'mod' not found 

를 문제가 발생하지 않습니다 나는 새로운 상황에서 폐쇄를 사용하기 전에 글로벌 환경에서 정의되는 mod()과 폐쇄를 호출하는 것을 방지 할 수 있습니까

mod <- function(z){z+1} 
sq(2) 
rm(mod) 
sq(2) 

:하지만 난 경고 "In sq(2) : restarting interrupted promise evaluation"를 얻을? 그리고 스코프와 약속의 관점에서 여기서 무엇이 일어나고 있습니까?

답변

2

modify은 함수가 호출 될 때까지 평가되지 않는 약속입니다. force을 사용하여 정식 인수를 평가할 수 있습니다. 당신이 실제로하지 ?force에서

power <- function(x , modify){ 
    force(modify) 
    return(
     function(y){ 
     return( modify(y^x)) 
     } 
) 
} 
mod <- function(z){z+1} 
sq <- power(x = 2,modify = mod ) 
rm(mod) 
sq(2) 
# [1] 5 

참고 force를 사용해야합니다. 동일한 효과를 얻으려면 기호를 간단히 평가할 수 있습니다.

power <- function(x , modify){ 
    modify 
    return(
     function(y){ 
     return( modify(y^x)) 
     } 
) 
} 
mod <- function(z){z+1} 
sq <- power(x = 2,modify = mod ) 
rm(mod) 
sq(2) 
+1

@DavidHeckmann : @DavidHeckmann : @DavidHeckmann : 함수에 공식 인수로 전달 된 객체는 다른 함수가 아니라 그 방식으로 동작합니다. '? force'의 예를보세요. –