库/软件包开发 - 加载时的消息提示

22

有没有办法在用户加载 library(myCustomLibrary) 时显示一条消息? 加载完成后,我希望显示一条消息告诉用户如何运行所有测试函数。

3个回答

33

快速要点(更新于2021年):

  • 如果你的软件包有一个NAMESPACE,则以前可以在.onLoad()中执行此操作,但现在必须使.onLoad()“静默”。

  • 如果您的软件包有一个NAMESPACE,则可以在.onAttach()中调用,最好通过packageStartupMessage()进行调用(可以在无法使用cat()message()的情况下抑制它)。

  • 如果您的软件包没有NAMESPACE,则现在必须添加一个(以前可以在.First.lib()中执行此操作)-几年前,NAMESPACE已经成为强制性的了。

  • 无论哪种方式,请使用packageStartupMessage()而不是cat(),这样用户就可以选择禁止此选项。


1
+1 确实如此。我应该把它放在哪里?我的软件包的哪个文件中? - Matt Bannert
过去这很重要,人们使用 R/zzz.R -- 现在这主要是一种惯例。我认为你同样可以使用 R/onLoad.R - Dirk Eddelbuettel
2
在 Hadley 的书中提到,用户应该使用 .onAttach() 而不是 .onLoad() 来实现该目的。他没有解释为什么。 - jangorecki
我很失望,即使是R CMD check现在也会在.onLoad()而不是.onAttach()中给出一个注释。我的理由是:如果你使用package::function()调用一个函数,如果它在.onAttach()中,启动消息将不会显示。在某些情况下,源或引用可能仍然未知。 - MS Berends
我主要不喜欢这两个函数周围的非直观语言,但在20多年的软件包编写中,我通常发现《编写R扩展》既权威,又与R CMD check测试保持一致。标准会改变,但由于NAMESPACES现在已经普遍存在并且是必需的,这些区别有些意义。 - Dirk Eddelbuettel

9
是的。您可以使用 .onLoad.onAttach.First.lib 函数来在包加载时执行想要完成的任务。建议查看这些函数的帮助文档。如果是使用命名空间,应该使用 .onLoad;否则使用 .First.lib
一种惯例是将这些命令放在单独的 zzz.R 文件中,该文件仅用于处理与包相关的代码。

2

更新的答案(2019):

在“Good practice”帮助部分的? .onAttach 中,现在的建议是:

应尽可能使用 .onLoad 静默地加载命名空间, 启动消息由 .onAttach 给出。 这些消息(以及来自 .onLoad 的任何必要消息)应该使用 packageStartupMessage ,这样它们可以在分散注意力时被静音。

R CMD CHECK 将抱怨 .onLoad 不是静音的...

注:原始答案翻译为“最初的回答”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接