根据最近的讨论(例如 1 、 2 ),我现在在我的一些代码中使用环境。我的问题是,如何创建根据参数修改环境的函数?例如:
y <- new.env()
with(y, x <- 1)
f <- function(env,z) {
with(env, x+z)
}
f(y,z=1)
throw
Error in eval(expr, envir, enclos) : object 'z' not found
我正在使用环境同时将两组模拟分开(不重构我为一组实验编写的代码)。
最佳答案
最简单的解决方案是在引用对象时使用环境:
y <- new.env()
y$x <- 1
f <- function(env,z) {
env$x+z
}
f(y,z=1)
您需要分配
z
也适用于您的环境。y <- new.env()
with(y, x <- 1)
f <- function(env,z) {
assign("z", z, envir=env)
with(env, x+z)
}
f(y,z=1)
另一种选择是
attach
您的环境,以便现在可以直接使用变量。y <- new.env()
with(y, x <- 1)
f <- function(env,z) {
attach(env)
y <- x + z
detach(env)
y
}
f(y,z=1)
后一种解决方案很强大,因为它意味着您可以在新环境中使用任何附加环境中的任何对象,但这也意味着您需要非常小心已全局分配的内容。
编辑:
这很有趣,我并不完全理解这种行为(即为什么
z
不在 with
调用的范围内)。它与最初导致它超出函数范围的环境的创建有关,因为此版本有效:f <- function(z) {
y <- new.env()
with(y, x <- 1)
with(y, x+z)
}
f(y,z=1)
关于r - 使用函数和环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2646402/