當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R userhooks 獲取和設置加載、附加、分離和卸載鉤子的函數


R語言 userhooks 位於 base 包(package)。

說明

這些函數允許用戶設置在附加/分離包以及加載(卸載)命名空間之前要采取的操作。

用法

getHook(hookName)
setHook(hookName, value,
        action = c("append", "prepend", "replace"))

packageEvent(pkgname,
             event = c("onLoad", "attach", "detach", "onUnload"))

參數

hookName

字符串:鉤子名稱

pkgname

字符串:包/命名空間名稱

event

字符串:包的事件。可以縮寫。

value

一個函數或函數列表,或用於 action = "replace"NULL

action

應采取的行動。可以縮寫。

細節

setHook 為用戶提供了注冊鉤子的通用機製,即從係統(或用戶)函數調用的函數列表。最初的一組鉤子與包/命名空間上的事件相關聯:這些鉤子通過調用 packageEvent 來命名。

要完全刪除鉤子,請調用 setHook(hookName, NULL, "replace")

R包附於library或者通過其他方式加載,可以調用初始化代碼。看.onLoad有關初始化期間調用的包鉤子函數的說明。用戶可以通過提供的鉤子添加自己的初始化代碼setHook(),函數將被稱為funname(pkgname, pkgpath)裏麵一個try稱呼。

事件的順序取決於定義了哪些鉤子,以及包是附加的還是剛剛加載的。在定義了所有鉤子並附加了包的情況下,初始化事件的順序如下:

  1. 包命名空間已加載。

  2. 包的 .onLoad 函數已運行。

  3. 如果 S4 方法調度已打開,則運行 setLoadAction 設置的任何操作。

  4. 命名空間是密封的。

  5. 用戶的"onLoad" 鉤子已運行。

  6. 該包將添加到搜索路徑中。

  7. 包的 .onAttach 函數已運行。

  8. 包裝環境是密封的。

  9. 用戶的"attach" 鉤子已運行。

當分離包並卸載其命名空間時,會運行類似的序列(但相反):

  1. 用戶的"detach" 鉤子已運行。

  2. 包的 .Last.lib 函數已運行。

  3. 該包將從搜索路徑中刪除。

  4. 用戶的"onUnload" 鉤子已運行。

  5. 包的 .onUnload 函數已運行。

  6. 包命名空間已卸載。

請注意,當R會話結束,包沒有分離,命名空間也沒有卸載,所以相應的鉤子不會運行。

另請注意,某些用戶鉤子是在包不在搜索路徑上的情況下運行的,因此在這些鉤子中,需要使用雙(或三)冒號運算符來引用包中的對象,如示例中所示。

如果添加多個鉤子,它們通常按 getHook 顯示的順序運行,但 "detach""onUnload" 鉤子以相反的順序運行,因此包事件的默認設置是添加鉤子 ‘inside’ 現有鉤子。

鉤子存儲在基礎包的環境 .userHooksEnv 中,名稱為 ‘mangled’。

對於 getHook 函數,函數列表(可能為空)。對於setHook函數,沒有返回值。對於 packageEvent ,派生的鉤子名稱(字符串)。

注意

鉤子需要在它們修改的事件之前設置:對於標準包,這可能會出現問題,因為methods在啟動序列的早期加載和附加。通常設置鉤子的位置如下例所示,位於‘.R配置文件' 文件,但這不適用於methods.

例子

setHook(packageEvent("grDevices", "onLoad"),
        function(...) grDevices::ps.options(horizontal = FALSE))

也可以看看

librarydetachloadNamespace

有關雙冒號和三冒號運算符的討論,請參閱::

其他鉤子可能會在以後添加:函數 plot.newpersp 已經有它們。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Functions to Get and Set Hooks for Load, Attach, Detach and Unload。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。