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 |
如果提供,則限製搜索 |
type |
要查找的符號類型:可以是任何類型(默認為 |
細節
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
函數將選項 verbose
或 warn
設置為非零來完成的。
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。
相關用法
- R dump R 對象的文本表示
- R diag 矩陣對角線
- R deparse 表達式解析
- R deparseOpts 表達式解析選項
- R dots ...、..1 等在函數中使用
- R debug 調試函數
- R do.call 執行函數調用
- R dcf 以 DCF 格式讀寫數據
- R data.class 對象類
- R dimnames 對象的暗名稱
- R diff 滯後差異
- R dput 將對象寫入文件或重新創建它
- R duplicated 確定重複元素
- R dim 物體的尺寸
- R dontCheck 抑製檢查的身份函數
- R drop 刪除冗餘盤區信息
- R delayedAssign 延遲評估和承諾
- R difftime 時間間隔/差異
- R det 計算矩陣的行列式
- R detach 從搜索路徑中分離對象
- R data.frame DataFrame
- R double 雙精度向量
- R data.matrix 將 DataFrame 轉換為數字矩陣
- R date 係統日期和時間
- R droplevels 刪除因子中未使用的級別
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Foreign Function Interface。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。