【问题标题】:load/remove user-defined unit on package load/unload: best practise?在包加载/卸载时加载/删除用户定义的单元:最佳实践?
【发布时间】:2019-01-13 12:33:17
【问题描述】:

在我正在开发的包中,我需要定义一个新单位:相当于 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() 会失败。

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

【问题讨论】:

  • IMO 你做对了。当其他人只使用和导入您的一个功能时,您需要确保一切正常,因此 onLoad 是要走的路
  • @RolandASc .onUnload 怎么样,有什么意见吗?
  • 我不会因为你不这样做而指责你,但就个人而言,我喜欢你这样做。我也认为下面提供的答案并没有真正触及你的情况。同时,由于我没有任何修改建议,我无法提供答案:)

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


【解决方案1】:

这几乎绝对是为您的包裹做这件事的地方。我说几乎是因为每条规则都有一个例外。阅读以下部分以了解更多详细信息以及基本 R 手册中的良好实践建议

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

良好做法加载命名空间应尽可能保持静默, 使用 .onAttach 给出的启动消息。这些消息(以及任何 来自 .onLoad 的重要组件)应该使用 packageStartupMessage,所以他们 可以在会分散注意力的地方静音。

在这些钩子中不应调用 library 或 require。这 一个包加载其他包的方法是通过 Depends 字段 ‘DESCRIPTION’文件:这确保了依赖关系被记录在案 并且包以正确的顺序加载。加载命名空间 不应该改变搜索路径,而不是附加一个包, 命名空间对另一个包的依赖应该通过 (有选择地)从另一个包的命名空间导入。

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

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

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

【讨论】:

  • 感谢@adam-wheeler,我确实阅读了您提到的 R 手册页,但我仍然不清楚。从包用户的角度来看,我正在寻找一些包类型的 initialization 代码示例......
  • 我不明白你在问什么。 “从包用户的角度来看包类型的初始化代码”是什么意思
  • 亚当,我正在开发一个使用飞行高度层的软件包。我想为它们制定一个度量单位,并在整个包代码中使用它。然后我在我的问题中使用units 包代码来定义自定义单位FL。我的问题是将 FL 的定义放在我的包代码中的哪个位置,即.onLoad .onUnload 是否是正确的位置。
  • .onLoad 和 .onUnload 在名为 zzz.R 的文件中是执行此操作的正确位置。使用加载函数,因为这是它们的目的,这就是构建包的方式;使用 zzz.R 因为你想继承传统。
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2012-01-05
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多