R:

0

と呼ばれるまで閉鎖は私が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()を削除する前に何らかの方法でsq()を呼び出す場合、問題は発生しません。私は新しいコンテキストでクロージャを使用する前に、地球環境に定義されているmod()とクロージャを呼び出すことを避けることができますどのように

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

:が、私は警告"In sq(2) : restarting interrupted promise evaluation"を取得しますか?スコープと約束の点でここでは何が起こっていますか?

答えて

2

modifyは、関数が呼び出されるまで評価されないという約束です。 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を使用する必要はありません?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:仮引数として関数に渡されたオブジェクトは、そのようにだけでなく、他の機能を動作します。 '?force'の例を見てください。 –