您何时想在R中设置新环境?

时间:2010-12-10 19:22:18

标签: r

根据对R编程风格的讨论,我看到有人曾说他将所有自定义函数放入新环境并附加它。我还记得R环境可能用作哈希表。这是好风格吗?您何时想将数据/功能置于新的环境中?或者只是使用.GlobalEnv无论什么?

编辑提出问题的第二部分: 如何检查不同环境的同名变量?

3 个答案:

答案 0 :(得分:11)

MartinMächler建议您可以考虑将{em>一个时间考虑attach(),尽管他在将.Rdata文件附加到搜索路径的上下文中提出了这一点但你的Q基本上是一样的。

优势在于你不会使功能混乱全局环境,可能会被意外覆盖等等。虽然我不会把这种不好的风格称为什么,但你可能最好将自定义功能放入你自己的个人R套餐。是的,这将产生一些设置包结构和提供一些文档以允许安装包的开销,但从长远来看,这是一个更好的解决方案。使用像roxygen这样的工具,这个过程变得更容易启动。

就个人而言,我没有发现需要在使用R的10年以上摆弄环境;记录良好的脚本,可以加载,处理和分析数据,一直到目前为止都能很好地完成清理工作。


对于问题的第二部分(现已删除)的另一个建议是使用with()(来自@ Joshua的例子):

> .myEnv <- new.env()
> .myEnv$a <- 2
> a <- 1
> str(a)
 num 1
> ls.str(.myEnv, a)
a :  num 2
> str(.myEnv$a)
 num 2
> with(.myEnv, a)
[1] 2
> a
[1] 1

答案 1 :(得分:6)

如果您的数据和代码生态系统已经变得足够大,以至于您正在考虑在环境中隔离它,那么最好创建一个包。软件包为您提供更多支持:

  • 通过将代码和数据分成文件来管理一个变得越来越大而复杂的项目,以便一次挖掘更少。

  • 一个软件包可以很容易地将您的工作交给其他人,以便他们可以使用您的代码和数据。

  • 一个软件包为文档和报告提供了额外的支持。

为R设置包非常简单,只需调用package.skeleton(),我工作的每个项目都会将其代码和数据存储在包中。

我使用环境的唯一时间是我需要隔离一些代码的运行,通常是由其他人编写的脚本,这样它的副作用和变量名称就不会与我的交叉。我是通过evalq(source('someScript.R', local=TRUE), SomeEnvironment)来完成的。

答案 2 :(得分:4)

要回答您的第二个问题(您现在已删除),请使用ls.str,或者只使用$访问环境中的对象:

.myEnv <- new.env()
.myEnv$a <- 2
a <- 1
str(a)
ls.str(.myEnv, a)
str(.myEnv$a)