我在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
但是,如果我在删除sq()
之前以某种方式调用mod()
,则问题不会发生,但我收到警告"In sq(2) : restarting interrupted promise evaluation"
:
mod <- function(z){z+1}
sq(2)
rm(mod)
sq(2)
在新环境中使用闭包之前,如何避免在全局环境中使用mod()
调用闭包?在范围和承诺方面,这里发生了什么?
答案 0 :(得分: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)