gpt4 book ai didi

R:硬编码函数内变量的内容

转载 作者:行者123 更新时间:2023-12-04 16:59:04 32 4
gpt4 key购买 nike

我想使用存储在变量中的值创建一个函数,但以粘贴该变量的“内容”而不是变量调用的方式,这样一旦变量被重新分配,该函数就不会改变。
有没有一种优雅的方式来做到这一点?

var <- 3
f <- function(x) var + x

f(1)
#> [1] 4

var <- 1

f(1) # I would like the output to stay the same, i.e., the function to be "fixed" after its creation
#> [1] 2
创建于 2021-06-08 由 reprex package (v1.0.0)

最佳答案

在 R 中,您将使用这些方法之一创建闭包。您可以定义本地环境并复制 var那里

f <- local({var; function(x) var + x})
或者你可以用内联函数做类似的事情
f <- local({var; function(x) var + x})
或者您可以将该版本拆分为一个生成器函数
make_f <- function(var) function(x) var + x
f <- make_f(var)
所有这些都会卡住 var的值。函数内部 f .
您还可以编写一个辅助函数,该函数将更明确地说明环境创建
freeze_var <- function(fun, ..., .env=environment(fun)) {
mc <- match.call(expand.dots = FALSE)
dnames <- sapply(mc$..., deparse)
fenv <- new.env(parent=.env)
list2env(setNames(list(...), dnames), envir = fenv)
environment(fun) <- fenv
fun
}
然后你可以用它来用任何变量包装任何函数
var <- 3
f <- function(x) var + x
ff <- freeze_var(f, var)

f(1)
# [1] 4
ff(1)
# [1] 4

var <- 1
f(1)
# [1] 2
ff(1)
# [1] 4

关于R:硬编码函数内变量的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67881559/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com