如何切换到新环境并坚持下去?

时间:2015-10-13 17:52:40

标签: r

我正在为大型数据集构建分析工作流程,但首先我必须在较小规模的数据集上验证它。我想做的是将我的"采样"来自实际数据集的数据集,方法是将它们放在这样的环境中:

sample_data<-new.env()
attach(sample_data)
# downloading sample_data sets
sample_df_1 <- some_download_function(parameters1)
sample_df_2 <- some_download_function(parameters2)
...
# doing some stuff with them
...

但是,当我执行此操作时,sample_df_1sample_df_2将存储在全局环境中而不是sample_data环境中。当然我可以使用assign(..., envir=sample_data),但这有点单调乏味,我不希望它们显示在最终代码中。

使用with也不理想,因为其中的代码行不能逐个执行,这使得它在开发阶段相当不方便。

我希望实现与debugundebug相同的行为,例如:

switch_to_env(sample_data)
# Everything done here will be done within environment "sample_data"
# And the lines of codes here can be executed one by one
switch_to_env(.GlobalEnv)

正如@Gregor指出的那样,&#34;设置一个选项&#34;可能更好地描述了我正在寻找的东西:一个允许用户指定R REPL评估表达式的环境的选项。

谢谢!

4 个答案:

答案 0 :(得分:3)

我认为你可以定义一个新的运算符,它总是在你想要的环境中赋值

`%=%` = function(var,value){
 e <<- new.env()
 varname = deparse(substitute(var))
 assign(varname,value,envir = e)
}

然后,每次要在该环境中存储var时,都可以使用:

x %=% 1

为了能够在该环境中获取var,您可以使用:

attach(e)

将该var放入搜索路径

答案 1 :(得分:2)

这并不是您正在寻找的,但我认为它是可行的(而且是安全的)。

每当您想要在新环境中开发时,打开一个新文件和新的R会话(例如,sample_data.R),source()一个脚本,在父环境中创建您想要的任何对象,并且正常地进行开发。

当您想要从真实全球环境中的特定环境中访问这些内容时,您可以执行此操作(在原始R会话/环境中)

sample_data<-new.env()
source("sample_data.R", local = sample_data)

它有一些缺点:频繁切换来回非常不方便,特别是如果你的代码需要很长时间才能运行。但是,我实际上喜欢它会让你将不同参数的代码分成不同的文件 - 如果你混淆了你在哪个环境以及你在哪个环境中工作,这听起来像是一个潜在的错误系统。具有单独的文件通过强制执行代码分离提供一些保护。它还使您的各种子环境易于在运行中省略---注释掉主文件中的source()行会关闭整个子环境。

答案 2 :(得分:1)

您可以将变量分配给新环境:

sample_data<-new.env()
sample_data$sample_df_1 <- some_download_function(parameters1)
sample_data$sample_df_2 <- some_download_function(parameters2)

然后,您可以通过附加环境或使用sample_data$sample_df_1

在新环境中访问这些变量

这是你的意思吗?

答案 3 :(得分:0)

您应该使用 local(expr,env=sample_data)

像这样:

local({
sample_df_1 <- some_download_function(parameters1)
sample_df_2 <- some_download_function(parameters2)
...
# doing some stuff with them
...
}, env=sample_data)