在包装上加载/删除用户定义的单位加载/卸载:最佳实践?

时间:2018-08-06 14:04:26

标签: r r-package units-of-measurement

在我正在开发的包装中,我需要定义一个新的单位:相当于100英尺的飞行高度(FL)。

units软件包提供以下可能性:

units::install_conversion_constant("FL", "ft", 100)

为了进行包测试(devtools::test())和包检查(devtools::test())都可以使用此用户定义的单元I discovered进行单元测试,我需要注册它在包裹加载阶段。

这是我所做的:

zzz.R(根据"When you do need side-effects"部分的新文件中):

# register flight levels (FL) as a unit when loading this package
.onLoad <- function(libname, pkgname) {
  # install user-define unit for flight level
  units::install_conversion_constant("FL", "ft", 100)

  invisible()
}

# register flight levels (FL) as a unit when loading this package
.onUnload <- function(libname, pkgname) {
  # uninstall user-define unit for flight level
  units::remove_symbolic_unit("FL")

  invisible()
}

不这样做,将单元注册码放入某个R/unit-conversion.R文件中会使devtools::test()成功,但devtools::check()失败。

解决方案是否是在包装中注册新单元的正确方法(删除[也应该这样做?])?

1 个答案:

答案 0 :(得分:3)

几乎绝对是在您的包裹中放的地方。我说几乎是因为每个规则都有例外。请阅读以下部分,以了解更多详细信息以及基础R手册中的良好做法推荐

https://stat.ethz.ch/R-manual/R-devel/library/base/html/ns-hooks.html

  

良好做法,如果可能的话,加载命名空间应尽可能安静,   带有.onAttach给出的启动消息。这些消息(以及任何   .onLoad中的必填项)应使用packageStartupMessage,以便它们   可以让他们分心。      

这些钩子中不应有库调用或要求。的   软件包加载其他软件包的方式是通过   “ DESCRIPTION”文件:这可以确保对相关性进行记录   并以正确的顺序加载软件包。加载名称空间   不应更改搜索路径,因此,不要附加软件包,   命名空间对另一个包的依赖应通过以下方式实现   (有选择地)从另一个包的名称空间导入。

     

使用带参数帮助的库来显示有关以下内容的基本信息   包装应在计算的包装信息上使用格式   对象,并将其传递给packageStartupMessage。

     

在启动代码中不应调用install.packages:   可能非常慢,并且在2.14.2之前的R版本中可能会失败,如果   软件包安装是并行进行的。请参阅其帮助页面   替代品。

     

应将编译后的代码(例如,通过library.dynam)加载到.onLoad或   “ NAMESPACE”文件(而不是.onAttach)中的useDynLib指令。   同样,不应卸载已编译的代码(例如,通过   .last.lib或.onDetach中的library.dynam.unload),仅在.onUnload中。