R包中的命名空间

62

人们如何学习为R包命名空间?我觉得《R扩展》中的文档很好,但是当变量被导入或导出时究竟发生了什么,我并不清楚——我需要一个对这些指令的“傻瓜指南”。

您如何决定要导出什么?是所有东西都不应该需要pkg:::var语法的内容吗?导入又如何?

导入是否使确保在函数名称重叠时使用其他包函数不会混淆更容易?

S4类是否有特殊考虑?

我熟悉的使用命名空间的包(如sp和rgdal)相当复杂——有没有简单的示例可以使事情更清晰?

5个回答

40

1
@TylerRinker 是的,那就是要点。为每个你想要导出的函数创建一个 export(...) 语句。如果你导入了包,你还需要为每个包添加一个 import(...) 语句。另请参见本页面 @DirkEddelbuettel 的答案。 - Andrie
3
最好使用roxygen2来为您创建它。 - hadley
1
最近我在思考是否可以交互式地创建命名空间,就像使用 new.env() 时创建环境一样。我知道它们用于包,但是在开发不是包的大型脚本时,这仍然很有用。devtools 是否提供类似的功能呢? - Matt Bannert
@MattBannert 是的,但这并不是推荐的方法 - R暴露了很少的命名空间API,因此我们不得不绕过它进行黑客攻击,比如从基础R中提取内部C代码。 - hadley
@MattBannert 在评论中没有足够的空间讨论,但我不认为在脚本中使用命名空间有什么优势。最好在不同的脚本之间重新启动 R。 - hadley
显示剩余3条评论

30
几年后,在这里......我整合了 Chambers、其他 StackOverflow 帖子以及在 R 中的大量实验结果:https://blog.thatbuthow.com/how-r-searches-and-finds-stuff/ 。本文不太涉及 NAMESPACE/IMPORTS/DEPENDS 的实现,而是更多地讨论了这些结构的目的。回答了一些你的问题。

非常清晰易懂(不像“编写R扩展”文档那样...) - c-urchin

15

谢谢提醒,这让我想起我还没有阅读过它 - 尽管我很兴奋看到它已经发表。 - mdsumner
这本书的解释非常详细,正是我想要的。 - mdsumner

12
你也可以选择一个简单的小包并跟随它。我随机查看了digest,这是我较小的包之一。它加载了一个(小)动态库并导出了一个符号,即digest()函数。以下是NAMESPACE文件的内容:
## package has dynamic library
useDynLib(digest)

## and one and only one core function
export(digest)

请查看其余的源文件,也许可以尝试阅读编写R扩展,并结合示例进行学习,进行一些实验。


2
不错,再加上校验和算法 - 我一直在想是否有一个Rc...我的意思是一个R包;) - mdsumner
1
嗯,研究现有软件包的NAMESPACE文件确实是我学习如何做到这一点的方式。 - Sharpie


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接