清理具有许多功能的R包中的功能列表

时间:2011-06-21 15:04:31

标签: r

[根据出口名称的建议进行修订。] 我一直在研究一个接近100个函数的R包,可能更多。

我想拥有10个可见函数,每个函数可能有10个“不可见”子函数。

是否有一种简单的方法可以选择哪些功能可见,哪些功能不可见?

另外,为了避免'diff',是否有像“all.equal”这样的命令可以应用于两个不同的包以查看它们的不同之处?

4 个答案:

答案 0 :(得分:6)

您可以在程序包的基目录中创建名为NAMESPACE的文件。在此,您可以定义要导出到用户的功能,还可以从其他包导入功能。导出将使一个函数可用,导入将一个函数从另一个包传递给您,而不会让用户可用(如果您只需要一个函数并且不希望您的用户在加载您的用户时加载另一个包,则非常有用)。

我的包裹的一个小部分NAMESPACE:

useDynLib(qgraph)
export(qgraph)
(...)
importFrom(psych,"principal")
(...)
import(plyr)

分别加载已编译的函数,使函数qgraph()可用,从psych principal函数导入,从plyr导入plyr中导出的所有函数1}}的NAMESPACE。

有关详细信息,请阅读:

http://cran.r-project.org/doc/manuals/R-exts.pdf

答案 1 :(得分:4)

答案几乎可以肯定是创建一个包。一些经验法则可能有助于您的设计选择:

  • 包应解决一个问题
  • 如果您有解决其他问题的功能,请将它们放在单独的包中

例如,查看ggplot2包:

  • ggplot2是一个创建精彩图形的包
  • 导入plyr,这个包提供了一致的语法和方法来解决拆分,应用,合并问题
  • 这取决于reshape2,一个只有很少功能的包可以将宽数据转换为long,反之亦然。

关键是所有这些包都是由一位作者写的,即Hadley Wickham。

如果你决定制作一个包,你可以控制你的功能的可见性:

  • 只有导出的函数才能在命名空间中直接显示
  • 您还可以使用关键字internal标记某些功能,这样可以防止它们出现在自动生成的功能列表中。

如果您决定开发自己的套餐,我强烈推荐devtools package,并阅读devtools wiki

答案 2 :(得分:4)

我认为你应该以你最舒服的方式整理你的包装和代码;毕竟这是你的包裹。正如其他人所提到的,NAMESPACE可以用来预先控制暴露或不暴露给用户的内容,并且您不需要通过添加\alias{}来记录所有功能,只需要记录主要的用户调用函数。标记为Rd文件的所有支持函数,您不希望人们过多地了解它们,或者将它们隐藏在package.internals.Rd手册页上。

话虽这么说,如果你希望人们帮助开发你的软件包,或者用它来运行并做出惊人的事情,那么组织起来越好,工作就越容易。因此,逻辑上布置您的函数,可能是每个函数一个文件,以函数名称命名,或者将所有相关函数分组到一个R文件中。但要保持一致的方法。

如果您拥有更常用的通用功能,请考虑将这些功能拆分为其他人可以使用的独立包,而不必依赖于具有更具体的额外功能的大型包。然后,您的包可以依赖于此通用包,其他作者的包也可以。但是不要仅仅为了让它们变小来拆分包装。

答案 3 :(得分:3)

如果您重新提出的问题是关于“如何组织大包裹”,那么这可能适用:

  • NAMESPACE允许非常细粒度的函数导出:您的用户将看到10个可见函数

  • 如果您或用户'已知',通过:::三重冒号运算符

  • ,即使是不可见的函数也可以访问
  • 包装有各种尺寸和形状;关于“何时分裂”的一个常见规则可能是,只要您具有在不同情境中使用的功能

关于包装上的diff:嗯?包通常不是那么接近,因此需要一个比较功能。 diff命令对源代码确实非常有用。如果你真的想要,你可以在二进制代码上使用哈希函数,但我仍然对为什么会想要这个问题感到困惑。