在R中创建作用域表达式的合适方法是在评估后消除其变量的封装命令。
我现在使用的方式涉及使用with()
:
> with(data.frame(), {foo <- 5; bar <- 6; foo + bar})
[1] 11
> foo
Error: object 'foo' not found
但这显然是一个黑客攻击。
(顺便说一句,如果您将c()
而不是data.frame()
传递给with()
,则新变量实际上会在父环境中结束;不知道原因)
答案 0 :(得分:4)
local({foo <- 5; bar <- 6; foo + bar})
或
local({foo <- 5
bar <- 6
foo + bar})
来自?local
(我的重点)
local评估本地环境中的表达式。它等同于evalq,除了它的默认参数创建一个新的空环境。这对于创建匿名递归函数和一种有限的命名空间特征非常有用,因为环境中定义的变量在外部不可见。
答案 1 :(得分:1)
您可以使用match.call
,expression
和eval
:
> 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
解决方案接近您已经写过的内容。