2011-05-24 107 views
2

我正在开发一个具有系统依赖关系(大部分包是用C++)的R包,并且正在寻找分发的最佳实践。我相信没有办法用R软件包来分发系统软件包。似乎这个问题最近在this thread中引起了一些关注。没有root权限的R包的系统依赖关系

假设用户没有root权限,并且正在使用R的本地安装。他们在本地获取这些软件包的最佳方式是什么?是否像下载共享库一样简单,并将它们添加到$ R_HOME/Libraries中?或者最好是将它们下载到本地文件夹并设置LD_LIBRARY_PATH?

我对R相当陌生,所以我想知道是否有一个“首选”解决方案,以获得最佳最终用户体验。

回答

1

如果他们实际上是系统库,只需依赖他们,并可能通过autoconf进行测试。许多CRAN包装都是这样做的。

重新构建共享库的部署方式最好留给操作系统,Linux发行版,系统管理员......而不是用户空间应用程序。

+0

Dirk,谢谢你的回复。不幸的是,这对我们来说只是一个非常不吸引人的选择。这是一个最常用于大型计算集群的学术应用程序,用户通常使用他们所需的软件包保留R的本地安装。管理员可能会为每个用户请求添加系统软件包而犹豫不决。我确实认为这对R环境是一个有益的补充。 – 2011-05-24 19:30:33

0

你可以在inst/目录中包含任何你想要的东西,包括lib子目录。如果您只想在运行时访问这些库,则可以使用类似Sys.setenv(LD_LIBRARY_PATH=system.file("lib",package="mypkg"))的设置来相应地设置库路径。

如果您需要在安装/编译时链接库,可能会有点麻烦。我可以想象,你可以设置你的配置脚本和Makefile(R扩展手册第13-15页)来查找正确的位置......但我不知道如何做到这一点,它可能需要一些把玩身边做它(如果你这样做,请记录它!)

注意,包包含二进制文件不允许在CRAN(出于明显的安全原因),虽然R-伪造不会允许他们...

(这个建议没有被测试 - 我已经分发二进制可执行内,但从来没有图书馆 - 所以我希望这是有益的,或者至少不会产生误导。)

0

你可能会はnt查看bigmemory包的一种方法 - 它包括一个不重要的子集(16兆价值)的提升。

+0

不是那些模板头文件,它们在编译时会消失; OP希望对图书馆进行破解。本的答案更接近。 – 2011-05-25 14:07:15

+0

哎呀,本来可以发誓那些是'.cpp'文件。令人惊讶的是,增加了16兆的头文件! – hadley 2011-05-25 15:10:32

+0

有几个软件包都提供Boost头文件(在纯模板中使用),所以我们讨论了如何创建一个通用的包,这些包都依赖于这些包。 – 2011-05-25 15:21:18