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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。