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

lea*_*icR 18 r

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

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

Rei*_*son 11

马丁Mächler表明,这是一个你可能要考虑的时间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
Run Code Online (Sandbox Code Playgroud)


Sha*_*pie 6

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

  • 通过将代码和数据分离到文件中来管理变得越来越大且复杂的项目,以便一次挖掘更少.

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

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

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

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