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


R evalSource 使用源文件中的函數定義,無需重新安裝包

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

說明

使用trace 機製將源文件中的函數和/或方法的定義插入到包中。通常,這允許測試或調試一些函數的修改版本,而無需重新安裝大型軟件包。

用法

evalSource(source, package = "", lock = TRUE, cache = FALSE)

insertSource(source, package = "", functions = , methods = ,
           force = )

參數

source

evalSource 解析和評估的文件,以查找新的函數和方法定義。

insertSource 的參數可以是從先前調用 evalSource 返回的類 "sourceEnvironment" 的對象。如果將文件名傳遞給 insertSource,它將調用 evalSource 來獲取相應的對象。有關詳細信息,請參閱有關類的部分。

package

(可選)新代碼對應的包的名稱以及它將插入到的包的名稱。盡管如果省略了包,計算將嘗試推斷包,但安全的方法是提供它。如果包未附加到搜索列表,則必須提供包名稱。

functions, methods

插入時使用的函數的字符串名稱(可選)。 functions 參數中提供的名稱應定義為源中的函數。對於 methods 參數中提供的名稱,需要一個方法表(通過調用 setMethod 生成,請參閱詳細信息部分);該表中的方法將由 insertSource 插入。在這兩種情況下,僅當修改後的函數或方法與加載的相應包中的版本不同時才會插入。

如果省略what,則源文件的評估結果將與包的內容進行比較(請參閱詳細信息部分)。

lock, cache

用於控製 evalSource 所采取的操作的可選參數。如果 lockTRUE ,則返回的對象中的環境將被鎖定,其所有綁定也將被鎖定。如果 cacheFALSE ,則在評估 source 文件期間將抑製方法和類定義的正常緩存。

通常建議使用默認設置,lock 支持作為源文件快照返回的對象的可信度,第二個以便 insertSource 稍後可以使用跟蹤機製插入方法定義。

force

如果是 FALSE ,則僅使用 trace 重新定義當前環境中的函數。如果是 TRUE ,其他對象/函數將被簡單地分配。默認情況下,如果未提供 functionsmethods 參數,則為 TRUE

細節

source 文件被解析和評估,默認情況下抑製其中包含的方法和類定義的實際緩存,以便可以以可逆的方式測試函數和方法。如果一切順利,結果是一個包含與源文件中的方法和類定義相對應的分配對象和元數據的環境。

從此環境中,對象被插入到包中,插入到其命名空間(如果有的話),以便在當前會話期間使用,或者直到通過調用 untrace 恢複到原始版本。插入是通過調用 trace 的內部版本來完成的,以使恢複成為可能。

因為使用了跟蹤機製,所以隻會插入function-type對象、函數本身或S4方法。

functionsmethods 參數均被省略時,insertSource 將從 source 文件的計算結果中選擇所有合適的對象。

在所有情況下,僅插入源文件中與包中相應對象不同的對象。 “differ” 的定義是參數列表(包括默認表達式)或函數體不相同。請注意,在方法的情況下,包中的相應簽名不需要特定的方法:與將為該簽名選擇的方法進行比較。

計算中不要求提供的源文件與原始包源中的文件相同,盡管如果要修改包,這種情況既可能又合理。計算中沒有任何內容比較源文件:通過評估 source 生成的對象將作為對象與包的內容進行比較。

來自類 "sourceEnvironment" 的對象,"environment" 的子類(請參閱有關該類的部分) 環境包含由源文件評估產生的所有對象的版本。該類還具有用於創建時間、源文件和包名稱的槽。未來的擴展可能會使用這些對象進行版本控製或其他代碼工具。

返回的對象可用於調試(請參閱有關該主題的部分)或作為將來調用 insertSource 中的 source 參數。如果在第一次調用中隻插入了一些修訂後的函數,則可以通過提供環境和可選的合適的 functions 和/或 methods 參數,在以後的調用中插入其他函數,而無需重新評估源文件。

調試

一旦通過 insertSource 將函數或方法插入到包中,就可以通過標準調試工具對其進行研究;例如, debugtrace 的各種版本。

trace 的調用應采用額外參數 edit = env ,其中 env 是對 evalSource 的調用返回的值。跟蹤機製已用於從源文件安裝修訂版本,並且提供參數可確保跟蹤的是此版本,而不是原始版本。請參閱下麵的示例。

要關閉跟蹤,但保留源版本,請使用 trace(x, edit = env),如示例中所示。要從包返回到原始版本,請使用 untrace(x)

"sourceEnvironment"

此類中的對象可以被視為環境,以提取 evalSource 生成的函數和方法的版本。這些對象還具有以下插槽:

packageName

源代碼對應的包的字符串名稱。

dateCreated

評估源文件的日期和時間(通常來自對 Sys.time 的調用)。

sourceFile

使用的源文件的字符串名稱。

請注意,使用環境不會更改 dateCreated

例子

## Not run: 
## Suppose package P0 has a source file "all.R"
## First, evaluate the source, and from it
## insert the revised version of methods for summary()
  env <- insertSource("./P0/R/all.R", package = "P0",
     methods = "summary")
## now test one of the methods, tracing  the version from the source
  trace("summary", signature = "myMat", browser, edit = env)
## After testing, remove the browser() call but keep the source
  trace("summary", signature = "myMat", edit = env)
## Now insert all the (other) revised functions and methods
## without re-evaluating the source file.
## The package name is included in the object env.
  insertSource(env)

## End(Not run)

也可以看看

trace 用於底層機製,也用於 edit= 參數,可用於類似的目的;該函數以及 debugsetBreakpoint ,用於更麵向傳統調試風格的技術。當前函數直接用於修改現有包的某些源代碼的情況,盡管也可以通過在源代碼中插入調試代碼來使用它(如果涉及的調試很重要,則更有用)。如詳細信息部分所述,源文件不必與原始包源中的文件相同。

相關用法


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