r - 使用函数和环境

标签 r scope

根据最近的讨论(例如 12 ),我现在在我的一些代码中使用环境。我的问题是,如何创建根据参数修改环境的函数?例如:

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/

相关文章:

r - 如何将与参数相同的值分配给 R 中的函数向量?

python flask,使用另一个类将 session 保持在范围内

C# 创建函数作用域

r - 将满足特定条件的所有行分组

r - 我可以让带有手动 index.html 的预编译 PDF 的 R 小插图显示小插图列表吗?

arrays - 如何在 R 中提取 1x1 数组切片作为矩阵?

r - 如何使用networkD3库设置桑基图中节点的颜色

tcl - Tcl 中的变量范围

PHP:->和::之间的区别

Ruby:在让出过程中,谁是 block 内的 self?