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(),不會出現問題,但我得到警告"In sq(2) : restarting interrupted promise evaluation"

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

我怎樣才能避免在新的環境中使用關閉前致電與mod()封閉在全球環境中被定義?那麼在範圍和承諾方面發生了什麼?

回答

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:作爲形式參數傳遞給函數的任何對象都以這種方式行爲,而不僅僅是其他函數。看看'force'中的例子。 –