在我正在开发的包装中,我需要定义一个新的单位:相当于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()
失败。
解决方案是否是在包装中注册新单元的正确方法(并删除[也应该这样做?])?
答案 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中。