当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R ns-hooks 命名空间事件的钩子


R语言 ns-hooks 位于 base 包(package)。

说明

包可以提供在加载、附加、分离或卸载时调用的函数。

用法

.onLoad(libname, pkgname)
.onAttach(libname, pkgname)
.onUnload(libpath)
.onDetach(libpath)
.Last.lib(libpath)

参数

libname

一个字符串,给出定义名称空间的包所在的库目录。

pkgname

给出包名称的字符串。

libpath

给出包的完整路径的字符串。

细节

加载后,loadNamespace 查找名为 .onLoad 的钩子函数,并在密封命名空间和处理导出之前调用它(使用两个未命名参数)。

当附加包时(通过 libraryattachNamespace ),将查找钩子函数 .onAttach ,如果找到则在密封包环境之前调用(使用两个未命名参数)。

如果函数 .onDetach 位于命名空间中或 .Last.lib 从包中导出,则当包被 detach 编辑时,将调用该函数(使用单个参数)。请注意,如果 .onAttach 失败,它可能会被调用,因此应该防御性地编写它。 (它在 tryCatch 内调用,因此错误不会阻止包被分离。)

如果卸载命名空间(通过 unloadNamespace ),则在最终卸载之前运行钩子函数 .onUnload (使用单个参数)。

请注意,.onLoad.onUnload 中的代码不应假定除基本包之外的任何包位于搜索路径上。当前包中的对象将是可见的(除非规避了这一点),但应导入其他包中的对象或应使用双冒号运算符。

.onLoad.onUnload.onAttach.onDetach 被视为命名空间中的内部对象,不应导出(而 .Last.lib 应导出)。

请注意,包不会分离,命名空间也不会在包结束时卸载。R除非用户安排这样做(例如,通过 .Last)。

命名空间函数所需的任何内容都应在加载/卸载时由.onLoad.onUnload钩子。例如,可以加载 DLL(除非由useDynLib指令中的‘NAMESPACE’文件)并在中初始化.onLoad并卸载于.onUnload.采用.onAttach仅适用于仅当包对用户可见时才需要的操作(例如 start-up 消息)或需要在创建包环境后运行。

好的做法

加载命名空间应尽可能保持静默,并由 .onAttach 给出启动消息。这些消息(以及 .onLoad 中的任何重要消息)应使用 packageStartupMessage,以便在分散注意力的情况下将其静音。

不应该有任何电话library也不require在这些钩子中。一个包加载其他包的方式是通过‘⁠取决于⁠' 中的字段DESCRIPTION’ 文件:这可确保记录依赖性并按正确的顺序加载包。加载命名空间不应更改搜索路径,因此不应附加包,而是应通过(有选择地)从其他包的命名空间导入来实现命名空间对另一个包的依赖。

使用带有参数 helplibrary 来显示有关包的基本信息,应在计算的包信息对象上使用 format 并将其传递给 packageStartupMessage

不应该有任何电话installed.packages在启动代码中:它可能非常慢并且在以下版本中可能会失败R如果软件包安装并行进行,则在 2.14.2 之前。请参阅其帮助页面以获取替代方案。

应加载已编译的代码(例如,通过 library.dynam) 在.onLoad或一个useDynLib指令中的‘NAMESPACE' 文件,而不是在.onAttach。同样,不应卸载已编译的代码(例如,通过 library.dynam.unload) 在.Last.lib也不.onDetach, 只有在.onUnload.

也可以看看

setHook 展示了用户如何在相同事件上设置钩子,并列出了涉及所有钩子的事件序列。

reg.finalizer 用于在会话结束时运行的钩子。

loadNamespace 了解有关命名空间的更多信息。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Hooks for Namespace Events。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。