精简版
对于那些不想通过我的“案例”来读取,这是本质:
- 什么是最小化的新软件包打破现有代码的机会被推荐的方式,即让你写尽可能稳定的代码?
是什么使得命名空间机制时,最好使用的推荐方式
一)只使用贡献包(说的只是一些[R分析项目)?
B)对于开发自己的包?
如何最有效地避免相对于正规课程 (主要是冲突引用类在我的情况),因为竟然没有一个命名空间机制媲美
::
上课(AFAIU)?
将R宇宙的运作方式
这是什么,一直在我的脑海两年左右的返现唠叨,但我不觉得我已经来到了一个令人满意的解决方案。 另外,我觉得它越来越差。
我们看到不断增加的件数CRAN , github上 , R-锻造之类的,这简直是太棒了。
在这样一个分散的环境,这是很自然的代码库,构成了R(让我们说这是基础R和贡献R,为简单起见)从理想的状态偏离相对于稳健性:人们遵循不同的惯例,有S3,S4 ,S4引用类等东西不能作为“对齐”,因为他们将是如果有一个“ 中央结算实例 ”,强迫约定。 没关系。
问题
鉴于上述情况,它可以是很难用R编写健壮的代码。 不是你需要将在基地R.对于你最终会装载了不少贡献包某些项目的一切。
恕我直言,在这方面最大的问题是命名空间概念放在R来使用的方式,R允许写一个特定的功能/方法的名称,没有明确要求它的命名空间(即foo
与namespace::foo
)。
所以为了简单起见,这就是大家都在做。 但这样一来,名字冲突,断码而无需重写/重构你的代码只是一个时间问题(或装载不同的包的数量)。
在最好的情况,你就会知道哪些现有功能被屏蔽/由新加入的包超载。 在最坏的情况,你会不知道,直到你的代码休息。
一对夫妇的例子:
- 尝试加载RMySQL和RSQLite在同一时间,他们不走非常好
- 也RMongo将覆盖的某些功能RMySQL
- 预测掩盖了很多东西相对于ARIMA相关的功能
- R.utils甚至掩盖了
base::parse
程序
(我不记得这功能特别是造成问题,但我愿意,如果有兴趣再次查找)
出人意料的是,这似乎并没有理会很多程序员在那里。 我试图加息几次,在R-devel的 ,没有显著无济于事。
使用的缺点::
操作
- 使用
::
操作可能显著伤害在某些情况下效率多米尼克Samperi 指出 。 - 当开发你自己的包,你甚至不能使用
::
操作在整个自己的代码作为你的代码是没有真正的包还没有,因此有还没有命名空间呢。 因此,我将不得不开始坚持到foo
路,构建,测试,然后回去改变一切namespace::foo
。 并不是的。
可能的解决方案,以避免这些问题
- 重新分配从各包中的每个功能到遵循一定的命名约定的变量,例如
namespace..foo
为了避免与相关联的低效率namespace::foo
(I概述一次这里 )。 优点:它的工作原理。 缺点:它的笨拙和您双击使用的内存。 - 发展你的包时, 模拟一个命名空间。 AFAIU,这是不是真的有可能,至少我被告知所以当时 。
- 强制要求使用
namespace::foo
。 恕我直言,这将是最好的事情。 当然,我们会失去一些扩展简单,但随后再次将R宇宙只是没有简单了(至少它不是在早期的00一样简单)。
而关于(正规)班是什么?
除了上述方面, ::
方式工作得很好的函数/方法。 但是,我们的类定义?
拿包TIMEDATE与它的类timeDate
。 说一个包走来其中也有一类timeDate
。 我不明白我怎么能明确指出我想类的新实例timeDate
从两个包。
像这样将无法工作:
new(timeDate::timeDate)
new("timeDate::timeDate")
new("timeDate", ns="timeDate")
这可以是一个巨大的问题,因为越来越多的人转而到OOP风格为他们的R程序包,从而导致大量的类定义的。 如果有一种方法来明确处理类定义的命名空间,我非常感谢指针!
结论
尽管这是一个有点冗长,我希望我能点出核心问题/问题,我也可以在这里提高大家的认识。
我认为devtools和mvbutils确实有可能是值得推广的一些方法,但我敢肯定有更多的话要说。