R:闭包在调用之前找不到对象
R: closure can't find object until called
我对 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()
的闭包?在范围界定和承诺方面发生了什么?
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)
我对 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()
的闭包?在范围界定和承诺方面发生了什么?
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)