[英]Force evaluation with deparse in R
我有一个产生函数的函数:
fun1 <- function (x)
return (function() x)
到函数生成时, x
的值已经基本上是一个常数:
fun2 <- fun1 ("a")
但是,当我打印fun2
,它不会显示实际值,它只显示"x"
即使它现在已经过时了:
> fun2
function() x
<environment: 0x55a9f94f9fc8>
如何强制对x
进行评估,以便fun2
打印为
function() "a"
或者它是如何生产的?
没有必要在这里诉诸deparse
。 您可以将 x 的评估值写入新创建的函数体:
fun1 <- function (x){
f <- function() x
body(f) <- x
f
}
以便:
fun1("a")
#> function ()
#> "a"
#> <environment: 0x00000146d0449dd8>
和
f <- fun1("a")
f()
#> [1] "a"
编辑
如果你想让f
接受一个论点,你可以这样做:
fun1 <- function (x){
f <- function(y) y + x
body(f)[[3]] <- x
f
}
以便
fun1(3)
#> function (y)
#> y + 3
#> <environment: 0x00000146d4b702a0>
这将替换fun
主体中的所有x
实例。 在示例中fun1
有一个参数,但它将继续使用fun
使用的多个fun1
参数将它们全部替换为fun
。 我们还将fun
的环境设置为fun1
的调用者中的环境,允许调用者根据需要通过指定envir
来更改该envir
。
fun1 <- function (x, envir = parent.frame()) {
fun <- function() x
body(fun) <- do.call("substitute", list(body(fun)))
environment(fun) <- envir
fun
}
fun2 <- fun1("a")
fun2
## function ()
## "a"
environment(fun2)
## <environment: R_GlobalEnv>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.