在R中创建范围表达式以清理中间变量

时间:2017-10-01 12:08:53

标签: r scope evaluation

在R中创建作用域表达式的合适方法是在评估后消除其变量的封装命令。

我现在使用的方式涉及使用with()

> with(data.frame(), {foo <- 5; bar <- 6; foo + bar})
[1] 11
> foo
Error: object 'foo' not found

但这显然是一个黑客攻击。

(顺便说一句,如果您将c()而不是data.frame()传递给with(),则新变量实际上会在父环境中结束;不知道原因)

2 个答案:

答案 0 :(得分:4)

local({foo <- 5; bar <- 6; foo + bar})

local({foo <- 5 bar <- 6 foo + bar})

来自?local(我的重点)

  

local评估本地环境中的表达式。它等同于evalq,除了它的默认参数创建一个新的空环境。这对于创建匿名递归函数和一种有限的命名空间特征非常有用,因为环境中定义的变量在外部不可见

答案 1 :(得分:1)

您可以使用match.callexpressioneval

> no_effect <- function(...){
+   .call <- match.call()
+   .call[[1]] <- as.symbol("expression")
+   expr <- eval(.call)
+   
+   eval(expr, list(), enclos = parent.frame())
+ }
> 
> no_effect({foo <- 5; bar <- 6; foo + bar})
[1] 11
> foo
Error: object 'foo' not found

解决方案接近您已经写过的内容。