R 在包加载/卸载时加载/删除用户定义的单元:最佳实践?
在我正在开发的软件包中,我需要定义一个新的单位:飞行高度层(FL),相当于100英尺R 在包加载/卸载时加载/删除用户定义的单元:最佳实践?,r,r-package,units-of-measurement,R,R Package,Units Of Measurement,在我正在开发的软件包中,我需要定义一个新的单位:飞行高度层(FL),相当于100英尺 units包提供了以下可能性: units::install_conversion_constant("FL", "ft", 100) 为了使包测试(devtools::test())和包检查(devtools::test())都能用于使用此用户定义单元的单元测试,我需要在包加载阶段注册它 以下是我所做的: 在zzz.R中(根据第节的新文件): #加载此包时,将飞行高度层(FL)注册为一个单位 .onLoad
units
包提供了以下可能性:
units::install_conversion_constant("FL", "ft", 100)
为了使包测试(devtools::test()
)和包检查(devtools::test()
)都能用于使用此用户定义单元的单元测试,我需要在包加载阶段注册它
以下是我所做的:
在zzz.R
中(根据第节的新文件):
#加载此包时,将飞行高度层(FL)注册为一个单位
.onLoad这几乎绝对是为您的包裹执行此操作的地方。我这样说几乎是因为每一条规则都有例外。请阅读以下章节,了解更多详细信息以及base R手册中的良好实践建议
良好实践加载命名空间时应尽可能保持沉默,
具有由.onAttach给出的启动消息。这些消息(以及任何
.onLoad)中的基本组件应使用packageStartupMessage,以便
可以在他们会分散注意力的地方保持沉默
这些钩子中不应该有对库的调用,也不应该有require。这个
包加载其他包的方式是通过中的Depends字段
“描述”文件:这确保了依赖性被记录下来
并按正确的顺序装入包裹。加载命名空间
不应更改搜索路径,因此与其附加程序包,
命名空间对另一个包的依赖性应该通过
(有选择地)从另一个包的命名空间导入
使用带参数的库帮助显示有关的基本信息
包应使用计算包信息的格式
对象并将其传递给packageStartupMessage
启动代码中不应调用installed.packages:它是
在2.14.2之前的R版本中,如果
软件包安装正在并行进行。有关详细信息,请参见其帮助页面
替代品
编译后的代码应以.onLoad或
“NAMESPACE”文件中的useDynLib指令,而不是.onAttach中的。
同样,编译后的代码也不应卸载(例如,通过
library.dynam.unload)在.Last.lib或.onDetach中,仅在.onUnload中
在我看来,你做的是对的。当其他人只使用和导入您的一个函数时,您需要确保这些功能正常工作,因此onLoad是解决此问题的方法go@RolandASc关于.onUnload
,你有什么意见吗?我不会因为你不做而叫你出来,但就我个人而言,我喜欢你做。我还认为,下面提供的答案与您的案例没有太大关系。同时,我无法提供答案,因为我没有任何修改建议:)谢谢@adam wheeler,我确实阅读了你提到的R手册页面,但我仍然不清楚。我在从软件包用户的角度寻找一些软件包初始化代码的例子……我不明白你在问什么。你所说的“从包用户角度看包类初始化代码”是什么意思亚当,我正在开发一个利用飞行高度的包。我希望为它们提供一个度量单位,并在整个包代码中使用它。然后,我使用我的问题中的单位
包代码来定义自定义单位FL。我的问题是在我的包代码中把FL的定义放在哪里,即.onLoad
和和onUnload
是否是正确的位置。在一个名为zzz.R的文件中,onLoad和.onUnload是正确的位置。使用load函数,因为这是它们要做的,这是包应该如何构建的;使用zzz.R是因为你想继承传统。
# 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()
}