我正在为大型数据集构建分析工作流程,但首先我必须在较小规模的数据集上验证它。我想做的是将我的"采样"来自实际数据集的数据集,方法是将它们放在这样的环境中:
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_1
和sample_df_2
将存储在全局环境中而不是sample_data
环境中。当然我可以使用assign(..., envir=sample_data)
,但这有点单调乏味,我不希望它们显示在最终代码中。
使用with
也不理想,因为其中的代码行不能逐个执行,这使得它在开发阶段相当不方便。
我希望实现与debug
和undebug
相同的行为,例如:
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评估表达式的环境的选项。
谢谢!
答案 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)