在 R 中使用 deparse 进行强制评估
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
来更改它。
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>
我有一个生成函数的函数:
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
来更改它。
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>