我经常想在全球环境下的环境中创建许多变量。这可以使用envir
的{{1}}参数轻松完成 - 如果由一个源文件创建的所有变量都应该进入单个环境。
但我通常使用一个创建变量集的文件。一组应该进入一个环境,另一组进入另一个环境,依此类推。我不想将此文件拆分为多个文件,然后多次调用sys.source
。
相反,我想要一个允许我更改默认环境以分配新变量的命令。例如:
sys.source
但e <- new.env()
setDefaultEnvironment(e)
tmp <- 2
e$tmp # 2
.GlobalEnv$tmp # Error: object 'tmp' not found
不是真正的命令。
在R中有没有安全的方法来做这种事情?
答案 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;
}
}