r-在包加载/卸载时加载/删除用户定义的单元:最佳实践



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

units包提供以下可能性:

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

为了使包测试(devtools::test()(和包检查(devtools::test()(都能使用这个用户定义的单元进行单元测试,我发现我需要在包加载阶段注册它。

以下是我所做的:

zzz.R中(根据"当您do需要副作用时"部分的新文件(:

# 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()会失败。

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

这几乎绝对是为您的包做这件事的地方。我说几乎是因为每一条规则都有例外。阅读下面的章节,了解更多细节和基本R手册中的良好实践建议

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

良好做法加载命名空间应尽可能保持静默,带有.onAttach提供的启动消息。这些消息(以及.onLoad中的基本消息(应该使用packageStartupMessage,这样它们可以在会分散注意力的地方保持沉默。

在这些钩子中不应该有对库或require的调用。这个包加载其他包的方式是通过中的Depends字段"DESCRIPTION"文件:这样可以确保记录依赖关系并且以正确的顺序装载包装。加载命名空间不应更改搜索路径,因此与其附加包,命名空间对另一个包的依赖性应该通过(选择性地(从另一个包的命名空间导入。

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

启动代码中不应该有对installed.packages的调用:它是可能非常慢,并且可能在2.14.2之前的R版本中失败,如果软件包安装正在并行进行。查看其帮助页面替代方案。

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

最新更新