用C语言为R语言写扩展模块的几点体会
1. 由于R是向量语言,所用简单变量均为向量,所以参数传递时均是传递的指针。矩阵也可当成向量来处理,不过是一列接一列,是一长向量。
2. 尽量用 R 的函数 R_alloc 来申请内存,这样R将能自动回收,不必自己去 free。
3. 最好使用 R_CMethodDef cMethods[] 和 R_init_myLib(DllInfo *info) 登记C函数。
4. 在NAMESPACE文件中加入两行:
exportPattern("^[^\\.]")
useDynLib(DLL_name)
第一行输出所有不是以'.'开头的函数名;
第二行中动态包不用扩展名(.so
或 .dll),这样,在R包中通过 library.dynam(“DLL_name”, “package_name“)
装入动态库后,就可以直接使用C扩展函数了,否则,在 library(package_name)之后,还必须动态装入
(dyn.load)DLL才行。
5. 用 R CMD SHLIB 可以编译产生动态库。打包则为:
Linux下:
R CMD build project_dir
windows下,需要先安装编译环境。可用 Rtools (http://www.murdoch-sutherland.com/Rtools/)来安装。还可安装微软的htmlhelp.exe。然后运行命令:
Rcmd build --force --binary project_dir