如何让R包自定义启动消息在自动冲突提示后打印
解决R包ale加载时自定义消息顺序问题
方案一:用later包延迟打印消息
R加载包时,冲突提示是在包附着到搜索路径的过程中同步输出的,常规的.onAttach()或.onLoad()代码会先于冲突提示执行。要让自定义消息排在冲突提示之后,可借助later包的延迟执行功能,让消息等R完成当前附着流程后再打印。
操作步骤:
- 在包的DESCRIPTION文件里,把
later添加到Imports依赖项中 - 在包的
.onAttach()函数里用later::later()包裹消息打印代码:
.onAttach <- function(libname, pkgname) { later::later(function() { packageStartupMessage( "\nThe 'get()' function for 'ale' works such that the masked base::get() still works fine without modification." ) }, delay = 0.01) }
方案二:利用R的包附着钩子(无需额外依赖)
如果不想引入later包,可以用R内置的钩子系统,把消息打印逻辑追加到包附着操作的末尾:
.onLoad <- function(libname, pkgname) { setHook( event = "package:attach", action = "append", function(...) { if (packageName() == "ale") { packageStartupMessage( "\nThe 'get()' function for 'ale' works such that the masked base::get() still works fine without modification." ) } } ) }
原理说明
- 方案一的
later::later()会把打印任务放进R的事件循环队列,等当前正在执行的包附着流程(包括输出冲突提示)全部完成后再执行,从而保证消息顺序正确。 - 方案二通过
action = "append"把自定义钩子加到默认附着操作的后面,钩子触发时冲突提示已经输出完毕,自然就能让自定义消息排在后面。
内容的提问来源于stack exchange,提问作者Tripartio
相关产品推荐
相关产品推荐

