在 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>