当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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