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

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

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

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()
}