如果您是软件包作者,那么当我们在大约一周内转移到2.14时,您很清楚包装结构即将发生的变化。其中一个变化是所有包都需要一个NAMESPACE,如果您没有生成一个包,将为您生成一个(R等同于您在美国的Miranda权利)。因此,作为一个好公民,我试图解决这个问题。以下是R-exts的部分:
1.6.5摘要 - 转换现有包
总结一下,将现有包转换为使用命名空间 涉及几个简单的步骤:
确定公共定义并将其置于导出指令中。 识别S3风格的方法定义并编写相应的S3方法 声明。识别依赖关系并替换任何require调用 导入指令(并在Depends和。中进行适当的更改) 导入DESCRIPTION文件的字段)。替换.First.lib函数 使用.onLoad函数或useDynLib指令。
为了确保我在这里做正确的事情,有人可以给出一个简短明确的定义/答案(我是否通过将几个小但相关的问题放在一起来打破规则?)。所有答案都应考虑到2.14,请:
谢谢!
答案 0 :(得分:8)
我在https://github.com/hadley/devtools/wiki/Namespaces写了一些关于这个主题的文章。
回答你的问题:
require
只应用于加载建议的包答案 1 :(得分:7)
CRAN软件包已经拥有NAMESPACE,因为它几乎是不朽的。只需选择一些您最喜欢的CRAN包并查看他们的NAMESPACE文件。
这可以像从snow
获取的单行(加评论)一样简单# Export all names unless they start with a dot
exportPattern("^[^.]")
像往常一样运行R CMD check
,在大多数情况下你应该没事。
答案 2 :(得分:4)
我将回答我自己的问题,并在将几个包转换为R 2.14之后了解了一些细节。
上面的描述从手册中给出的印象是,你所拥有的任何东西取决于:对于R 2.13应该转移到Imports:在R 2.14中。你应该这样做,但它们在功能上不是一对一的,我希望从下面的注释中可以清楚地看到它。
我们走了:
取决于:应该仅用于版本限制,例如'R> = 2.10'或'MASS>在R 2.14下没有别的0.1'。
拥有命名空间部分是一种通知用户可能存在名称冲突和“替换”的机制 - 换句话说就是覆盖正在使用的名称。 NAMESPACE文件必须与items中的Imports:字段匹配。导入的函数名称等将在sessionInfo()中的“通过命名空间加载(而不是附加)”下列出。这些软件包已安装但未加载(即没有库(某些导入的软件包))。
命名空间的另一个作用是使函数“内部”可用于您的包。通过这种方式,我的意思是如果你的包在导入的包中使用了一个函数,它就会被找到。
但是,当您在检查期间运行.Rd文件中的示例时,您曾经拥有的软件包取决于:在R 2.13中但现在在Imports中:在R 2.14下不可用。这是因为检查环境非常类似于在干净的环境中获取脚本(假设您正在使用R -vanilla,因此.Rprofiles等尚未运行)。除非你在你的例子中放置了一个库(需要的包)语句,否则即使在R 2.13下它也不能在R 2.14下工作。所以旧的例子不一定会运行,即使你的包Imports:所需的包,因为Imports:与Depends不完全相同:(严格来说,它们是附加的但没有加载)。
如果有任何错误,请纠正我。非常感谢Hadley Wickham和其他帮助我的人!
答案 3 :(得分:1)
我最近为我的一个套餐工作过。以下是我的新Depends,Imports和Suggests行
Depends: R (>= 2.15.0)
Imports: nlme, mvtnorm, KFAS (>= 0.9.11), stats, utils, graphics
Suggests: Hmisc, maps, xtable, stringr
stats,utils和graphics是基础R的一部分,但是用户可以将它们分离,然后我的包不起作用。如果您从命令行使用R,您可能会想“为什么有人会分离这些?”。但是,如果用户正在使用RStudio,比方说,我可以看到它们通过并“取消”所有包。奇怪的是,尽管如此,如果他们这样做,我不希望我的包裹停止工作。或者他们可能会重新定义绘图函数(或其他函数),然后我的包会失败。
我的NAMESPACE有以下几行
import(KFAS)
import(stats)
import(utils)
import(graphics)
我不想通过并跟踪我使用的统计数据,实用程序和图形函数,因此我导入了它们的整个命名空间。对于KFAS,我只需要2个函数,但是导出的函数名在版本之间发生了变化,所以我导入整个命名空间,然后在我的代码中测试用户拥有的版本。
对于mvtnorm和nlme,我只使用一个函数,所以我只导入它们。我可以导入整个命名空间,但尝试只导入我真正使用的。
importFrom(mvtnorm, rmvnorm)
importFrom(nlme, fdHess)
建议包出现的插图有
require(package)
在他们的行中。
对于我NAMESPACE中的导出功能,我有点不知所措。 CRAN已严格禁止在您的包裹代码中使用:::。这意味着如果我不导出功能,我限制创意重用。另一方面,我理解只需要使用稳定的arg列表导出要维护的函数并输出,否则我们通过更改函数接口来打破彼此的包。