根据对R编程风格的讨论,我看到有人曾说他将所有自定义函数放入新环境并附加它。我还记得R环境可能用作哈希表。这是好风格吗?您何时想将数据/功能置于新的环境中?或者只是使用.GlobalEnv无论什么?
编辑提出问题的第二部分: 如何检查不同环境的同名变量?
答案 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)