在R包

时间:2016-09-06 17:44:33

标签: c r dll

在编写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 tableR: C symbol name not in load table - error in linking with external .c files

为了清楚起见,我的R包的用户显然可以在他们的计算机上设置任意工作目录。完整路径方法(如上所示)可行的唯一方法是将工作目录设置为/FULL/PATH/TO/MY/R_PACKAGE/src,这当然是不切实际的。

2 个答案:

答案 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/即可(基本上)完成。