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


R dyn.load 對外函數接口


R語言 dyn.load 位於 base 包(package)。

說明

加載或卸載 DLL(也稱為共享對象),並測試 C 函數或 Fortran 子例程是否可用。

用法

dyn.load(x, local = TRUE, now = TRUE, ...)
dyn.unload(x)

is.loaded(symbol, PACKAGE = "", type = "")

參數

x

給出 DLL 路徑名的字符串,也稱為動態共享對象。 (有關這些術語的含義,請參閱“詳細信息”。)

local

一個邏輯值,控製 DLL 中的符號是存儲在它們自己的本地表中並且不在 DLL 之間共享,還是添加到全局符號表中。這是否有任何影響取決於係統。

now

邏輯控製是否立即解析(和重新定位)庫中的所有符號,還是推遲到使用它們為止。此控件對於開發人員測試庫是否完整並具有所有必需的符號以及用戶忽略丟失的符號很有用。這是否有任何影響取決於係統。

...

未來擴展的其他論點。

symbol

給出符號名稱的字符串。

PACKAGE

如果提供,則限製搜索name到此參數給出的 DLL(加上常規擴展,‘。所以', '.sl', '.dll’,……)。這是為了增加包的安全性,通過使用此參數可以確保沒有其他包可以覆蓋其外部符號。它的使用方式與.C,.Call,.Fortran.External職能。

type

要查找的符號類型:可以是任何類型(默認為 "" )、"Fortran""Call""External"

細節

dyn.load 加載的對象在除 macOS 之外的所有平台上都稱為“動態可加載庫”(縮寫為“DLL”),macOS 使用該術語來表示不同類型的對象。在類似 Unix 係統上,它們也被稱為“動態共享對象”(“DSO”),或簡稱為“共享對象”。 (POSIX 標準使用“可執行目標文件”,但其他標準沒有這樣做。)

有關如何創建和安裝合適的 DLL,請參閱“另請參閱”以及“編寫 R 擴展”和“R 安裝和管理”手冊。

遺憾的是,極少數平台(例如 Compaq Tru64)無法處理PACKAGE參數正確,並且可能錯誤地找到鏈接到的符號R.

dyn.load 的附加參數反映了 POSIX 係統上 dlopen() 例程的模式參數的不同方麵。它們使用戶可以更好地控製單個庫的加載過程。一般來說,默認值是合適的,隻有在有充分理由並且您了解其含義時才應該覆蓋它們。

local 參數允許控製所附加的 DLL 中的符號是否對其他 DLL 可見。雖然在自己的命名空間中維護符號是一種很好的做法,但在相關的 ‘chapters’ 之間共享符號的能力在許多情況下很有用。此外,在某些平台和操作係統版本上,某些庫必須全局加載其符號才能成功解析所有符號。

人們應該小心通過 now 參數使用延遲加載作為 FALSE 的潛在副作用。如果調用的例程缺少符號,則該進程將立即終止。預期用途是庫開發人員使用值 TRUE 進行調用,以檢查所有符號是否已實際解析,而普通用戶則使用 FALSE 進行調用,以便忽略缺失的符號並調用可用的符號。

添加這些的最初動機是為了避免 Java 虛擬機庫的 _init() 例程中發生此類終止。但是,本地加載的符號可能無法(可能讀取)供其他 DLL 使用。添加到全局表中的內容可供應用程序的所有其他元素使用,因此可以在兩個不同的 DLL 之間共享。

一些(非常舊的)係統不提供對本地/全局和惰性/渴望符號解析的(顯式)支持。這可能是微妙錯誤的根源。當使用不支持的選項時,可以安排發出警告消息。這是通過 options 函數將選項 verbosewarn 設置為非零來完成的。

https://www.stat.ucdavis.edu/~duncan/R/dynload/ 對這些附加參數進行了簡短討論,並提供了一些示例代碼。

函數dyn.load用於其副作用,它將指定的 DLL 鏈接到正在執行的R圖像。調用.C,.Call,.Fortran.External然後可用於執行庫中包含的已編譯 C 函數或 Fortran 子例程。返回值dyn.load是一個類的對象DLLInfo.看getLoadedDLLs有關該課程的信息。

函數 dyn.unload 取消 DLL 的鏈接。請注意,卸載 DLL 然後重新加載同名的 DLL 可能有效,也可能無效:在 Solaris 上,它使用加載的第一個版本。另請注意,某些 DLL 根本無法安全卸載:卸載實現 C 終結器但在卸載時未取消注冊的 DLL 會導致 R 崩潰。

is.loaded 檢查符號名稱是否已加載且可搜索,因此可用作 .C.Fortran.Call.External 中參數 .NAME 的字符串值。如果四個調用函數中的任何一個成功使用入口點,則它將成功,除非指定了 type。 (有關 Fortran 符號的映射方式,請參閱.Fortran。)請注意,基本包中的符號不可搜索,而其他包可以如此標記。

警告

不要在 library.dynam 加載的 DLL 上使用 dyn.unload :使用 library.dynam.unload 。這是係統內務管理所需要的。

注意

is.loaded需要您指定的名稱.C等等。它必須是一個字符串,所以不能是R用於注冊本機符號的對象(請參閱“Writing R Extensions”第 5.4 節)。一些已注冊的符號可以通過名稱使用,但大多數都不能,包括下麵示例中的符號。

默認情況下,當操作係統對打開文件數量的限製允許或可以增加時,可以加載的 DLL 的最大數量現在為 614,但其他情況下會更少(但至少為 100)。可以要求具體的最大值通過環境變量R_MAX_NUM_DLLS,在開始之前必須將其設置為(100 到 1000 之間的值)R會議。如果操作係統對打開文件數的限製不允許使用此最大值並且無法增加,R將因錯誤而無法啟動。最大值不允許超過操作係統對打開文件數量限製的 60%(在 Windows 上本質上不受限製,在 Unix 上通常為 1024,但在 macOS 上為 256)。有時可以使用命令修改限製(包括 macOS)ulimit -n(sh,bash) 或者limit descriptors(csh) 在用於啟動的 shell 中R。增加R_MAX_NUM_DLLS帶有一些內存開銷,並且要注意許多類型base connections也使用文件說明符。

如果無法確定操作係統對打開文件數量的限製,則 DLL 限製為 100 並且無法更改通過 R_MAX_NUM_DLLS.

DLL 的創建以及將它們運行時鏈接到執行程序的過程非常依賴於平台。近年來,該過程已得到一些簡化,因為 C 子例程調用 dlopen 已成為執行此操作的 POSIX 標準。在類 Unix 下,dyn.load 使用 dlopen 機製,並且應該在支持它的所有平台上工作。在 Windows 上,它使用標準機製 (LoadLibrary) 來加載 DLL。

在 Unix-alikes 中加載 DLL 的原始代碼由 Heiner Schwarte 提供。

例子

## expect all of these to be false in R >= 3.0.0 as these can only be
## used via registered symbols.
is.loaded("supsmu") # Fortran entry point in stats
is.loaded("supsmu", "stats", "Fortran")
is.loaded("PDF", type = "External") # pdf() device in grDevices

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

library.dynam 在包的 .onLoad 初始化中使用。

SHLIB 了解如何創建合適的 DLL。

.C.Fortran.External.Call

相關用法


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