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


R setLoadActions 設置包加載操作


R語言 setLoadActions 位於 methods 包(package)。

說明

這些函數為包提供了一種機製,用於指定在加載包名稱空間期間要完成的計算。此類操作是提供僅在加載時可用的信息(例如動態鏈接庫中的位置)的靈活方式。

setLoadAction()setLoadActions() 的調用指定加載相應命名空間時要調用的一個或多個函數,其中...參數名稱用作操作的標識名稱。

getLoadActions 報告當前定義的加載操作,並將包的命名空間作為其參數。

如果先前已為 where 命名空間設置了與給定名稱對應的加載操作,hasLoadAction 將返回 TRUE

evalOnLoad()evalqOnLoad() 安排特定表達式在加載時進行計算。

用法

setLoadAction(action, aname=, where=)

setLoadActions(..., .where=)

getLoadActions(where=)

hasLoadAction(aname, where=)

evalOnLoad(expr, where=, aname=)

evalqOnLoad(expr, where=, aname=)

參數

action, ...

一個或多個參數的函數,在加載此包時調用。這些函數將使用一個參數(包命名空間)進行調用,因此所有後續參數都必須具有默認值。

如果...的元素被命名,這些名稱將用於相應的加載元數據。

where, .where

為其定義加載操作列表的包的命名空間。如果調用來自包本身的源代碼,則通常會省略此參數,但如果一個包為另一個包提供加載操作,則需要該參數。

aname

操作的名稱。如果設置操作時未提供名稱,則默認使用指定操作序列中的位置( ".1" 等)。

expr

要在環境 where 中的加載操作中求值的表達式。在 evalqOnLoad() 的情況下,表達式按字麵解釋,在 evalOnLoad() 的情況下,必須預先計算該表達式,通常作為 "language" 類型的對象。

細節

evalOnLoad()evalqOnLoad() 函數是為了方便起見。他們構造一個函數來計算表達式並調用 setLoadAction() 來安排對該函數的調用。

作為 setLoadAction()setLoadActions() 的參數提供的每個函數都作為元數據保存在命名空間中,通常是包含對 setLoadActions() 的調用的包的元數據。當加載此包的名稱空間時,將調用每個函數。操作函數按照提供給 setLoadActions() 的順序調用。分配的對象具有根據調用中提供的名稱構造的元數據名稱;未命名的參數根據其在操作列表中的位置進行命名(".1" 等)。

可以在包的代碼中多次調用setLoadAction()setLoadActions();這些操作將安排在任何先前指定的操作之後,除非給 setLoadAction() 指定的名稱是現有操作的名稱。在典型的應用程序中,當從包自己的代碼調用以設置多個操作時,setLoadActions() 更方便。如果要構造操作名稱,則調用 setLoadAction() 會更方便,當一個包為另一個包構造加載操作時,這種情況更為典型。

可以通過在後續調用中分配相同的名稱(實際名稱或構造名稱)來修改操作。替換仍然必須是有效的函數,但如果目的是刪除先前指定的操作,則當然不能執行任何操作。

這些函數必須至少有一個參數。它們將通過一個參數來調用,即包的名稱空間。這些函數將在 S4 元數據處理結束時、動態鏈接任何已編譯代碼、調用 .onLoad()(如果有)以及緩存方法和類定義之後(但在密封命名空間之前)調用。 (僅當方法分派打開時才會調用加載操作。)

因此,函數可以分配或修改作為調用中的參數提供的命名空間中的對象。該機製允許包保存在加載時才可用的信息,例如從動態鏈接庫獲取的值。

加載操作應與 setHook() 提供的用戶加載鉤子進行對比。用戶鉤子通常是從包外部提供的,並在命名空間被密封後運行。加載操作通常是包代碼的一部分,並且操作列表通常是在安裝包時建立的。

加載操作可以直接在包的源代碼中提供。在一個包中提供工具以在另一個包中創建加載操作也是可能且有用的。軟件需要小心地在正確的環境(即目標包的命名空間)中分配操作函數。

setLoadAction()setLoadActions() 因其副作用而被調用,並且不返回任何有用的值。

getLoadActions() 返回所提供的命名空間中的操作的命名列表。

如果指定的操作名稱出現在此包的操作中,hasLoadAction() 將返回 TRUE

例子

## Not run: 
## in the code for some package

## ... somewhere else
setLoadActions(function(ns)
   cat("Loaded package", sQuote(getNamespaceName(ns)),
       "at", format(Sys.time()), "\n"),
  setCount = function(ns) assign("myCount", 1, envir = ns),
  function(ns) assign("myPointer", getMyExternalPointer(), envir = ns))
  ... somewhere later
if(countShouldBe0)
  setLoadAction(function(ns) assign("myCount", 0, envir = ns), "setCount")

## End(Not run)

也可以看看

setHook 更安全(因為它們在命名空間被密封後運行)和基礎包中更全麵的版本。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Set Actions For Package Loading。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。