即将到来的NAMESPACE,取决于2.14.0的进口变化(一些定义/请使用)

时间:2011-10-24 18:50:27

标签: r package packages

如果您是软件包作者,那么当我们在大约一周内转移到2.14时,您很清楚包装结构即将发生的变化。其中一个变化是所有包都需要一个NAMESPACE,如果您没有生成一个包,将为您生成一个(R等同于您在美国的Miranda权利)。因此,作为一个好公民,我试图解决这个问题。以下是R-exts的部分:

  

1.6.5摘要 - 转换现有包

     

总结一下,将现有包转换为使用命名空间   涉及几个简单的步骤:

     

确定公共定义并将其置于导出指令中。   识别S3风格的方法定义并编写相应的S3方法   声明。识别依赖关系并替换任何require调用   导入指令(并在Depends和。中进行适当的更改)   导入DESCRIPTION文件的字段)。替换.First.lib函数   使用.onLoad函数或useDynLib指令。

为了确保我在这里做正确的事情,有人可以给出一个简短明确的定义/答案(我是否通过将几个小但相关的问题放在一起来打破规则?)。所有答案都应考虑到2.14,请:

  1. R
  2. 使用的NAMESPACE的定义
  3. 有没有办法在构建和检查之前生成NAMESPACE,或者我们b / c一次然后编辑自动创建的NAMESPACE?
  4. DESCRIPTION文件中“Depends:”和“Imports:”之间的区别。特别是,为什么我会把一个包装在“取决于:”而不是“进口:”中,反之亦然?
  5. 听起来似乎不再使用“require”了,尽管它并没有这么说。这是正确的解释吗?
  6. 谢谢!

4 个答案:

答案 0 :(得分:8)

我在https://github.com/hadley/devtools/wiki/Namespaces写了一些关于这个主题的文章。

回答你的问题:

  1. 见Dirk的答案。
  2. 使用roxygen2
  3. 现在每个包都有一个命名空间,没有理由使用Depends。
  4. 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列表导出要维护的函数并输出,否则我们通过更改函数接口来打破彼此的包。