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'中的例子。 –