更改默认环境以分配新变量

时间:2012-05-25 18:42:11

标签: r

我经常想在全球环境下的环境中创建许多变量。这可以使用envir的{​​{1}}参数轻松完成 - 如果由一个源文件创建的所有变量都应该进入单个环境。

但我通常使用一个创建变量集的文件。一组应该进入一个环境,另一组进入另一个环境,依此类推。我不想将此文件拆分为多个文件,然后多次调用sys.source

相反,我想要一个允许我更改默认环境以分配新变量的命令。例如:

sys.source

e <- new.env() setDefaultEnvironment(e) tmp <- 2 e$tmp # 2 .GlobalEnv$tmp # Error: object 'tmp' not found 不是真正的命令。

在R中有没有安全的方法来做这种事情?

4 个答案:

答案 0 :(得分:17)

最好是明确的:改变全球状态是危险的。因此:

e <- new.env()
with(e, {foo <- bar; foo2 <- bar2})

将干净利落地完成工作,同时突出显示所涉及的环境。

答案 1 :(得分:9)

也许有人可以改进这一点,无需引用变量名称:

e <- new.env()
`%=%` <- function(x,y) {assign(x,y,envir = e)}

"d" %=% 5

e$d
[1] 5

但这对我来说有点愚蠢。也许只是直接使用assign?也许更多打字,但它会以更少的危险做你想做的事。

答案 2 :(得分:5)

evalq函数将评估其在指定环境中的第一个参数,因此您可以创建新环境,然后将分配包装到evalq

答案 3 :(得分:1)

相反,更改环境,一种简单的方法是将所有变量保存在列表中。

variable = 1;
local_var_dec();
global_var_global();
 
function local_var_dec(){
    console.log("local: "+ variable);
    if(typeof variable === 'undefined'){
        var variable = 2;
    }
}
 
function global_var_global(){
    console.log("global: "+ variable);
    if(typeof variable === 'undefined'){
        variable = 2;
    }
}