在编写R包时,加载动态链接库(即.so
文件)的正确方法是什么?到目前为止,唯一对我有用的解决方案是指定.so
文件的完整路径,例如:
dyn.load('/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.so')
显然,这种方法不适用于CRAN / Bioconductor提交,因为找不到.so文件。因此,我(尝试失败)尝试了以下替代方案:
1)library.dynam()
2)library.dynam('my_file.so')
3)library.dynam('my_file.so', 'R_PACKAGE')
4)system.file("src", "my_file.so", package = "R_PACKAGE")
相关链接:R: C symbol not in load table,R: C symbol name not in load table - error in linking with external .c files。
为了清楚起见,我的R包的用户显然可以在他们的计算机上设置任意工作目录。完整路径方法(如上所示)可行的唯一方法是将工作目录设置为/FULL/PATH/TO/MY/R_PACKAGE/src
,这当然是不切实际的。
答案 0 :(得分:1)
Writing R Extensions中描述的标准方法是:
1.5.4 useDynLib
NAMESPACE
文件可以包含一个或多个useDynLib
指令,这些指令允许需要加载的共享对象。*指令
useDynLib(foo)
注册共享对象
foo
**以加载library.dynam
。在加载包代码之后和运行加载挂钩功能之前,加载已注册的对象。只需要加载钩子函数来加载共享对象的包可以使用useDynLib
指令。
*
注意:如果软件包在R目录中包含R代码,则只能在所有版本的R中读取。**
请注意,这是共享对象的基本名称,并且将添加适当的扩展名(.so或.dll)。
答案 1 :(得分:1)
快点:
为什么需要发送.so
个文件?这将阻止上传到CRAN这样的公共存储库,它不接受二进制内容
您可以使用/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.so
计算完整system.file("src", "my_file.so", package="R_PACKAGE")
(但请务必确保实际安装的src/
不是标准的)
在所有其他情况(正如@BenBolker所指出的)R将知道如何创建动态库并为您加载它。每个包含编译代码的包都可以。只需将源代码放入src/
即可(基本上)完成。