大佬教程收集整理的这篇文章主要介绍了在C中调用R包中的C代码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,我的包rje中的@L_229_2@marginTable()使用相同名称的C函数.我想创建一个包含更多C代码的新包,其中一些可以使用marginTable()的C版本.我可以在新的C代码中调用该函数,而不仅仅是将C代码复制到新文件和包中吗?
或者使用这样的内部代码是不好的做法?
相关的可能性是使用R_init_rje.c中的类似内容在rje包中注册C函数
#include <Rinternals.h> #include <R_ext/Rdynload.h> SEXP rje(SEXP who) { Rprintf("Hello %s\n",CHAR(@R_675_10495@NG_ELT(who,0))); return R_NilValue; } static const R_CallMethodDef callMethods[] = { {".rje",(DL_FUNC) &rje,1},{NULL,NULL,0} }; void R_init_rje(DllInfo * info) { R_registerRoutInes(info,callMethods,null); }
在NAMESPACE
useDynLib(rje,.registration=TRUE)
然后,在R as中可以获得C级入口点的地址
rje_c = getNativeSymbolInfo(".rje",PACKAGE="rje")
.Call(.use_rje,rje_c$address,"A User")
同
#include <Rinternals.h> #include <R_ext/Rdynload.h> /* convenience deFinition of the function template */ typedef SEXP Rje_C_FUN(SEXP who); SEXP use_rje(SEXP rje_c_fun,SEXP who) { /* retrieve the function pointer,using an appropriate cast */ Rje_C_FUN *fun = (Rje_C_FUN *) R_ExternalPTraddr(rje_c_fun); return fun(who); }
#include <Rinternals.h> #include <R_ext/Rdynload.h> /* convenience deFinition of the function template */ typedef SEXP Rje_C_FUN(SEXP who); SEXP rje(SEXP who) { Rprintf("Hello '%s'\n",0))); return R_NilValue; } SEXP use_rje(SEXP rje_c_fun,using an appropriate cast */ Rje_C_FUN *fun = (Rje_C_FUN *) R_ExternalPTraddr(rje_c_fun); return fun(who); } static const R_CallMethodDef callMethods[] = { {".rje",{".use_rje",(DL_FUNC) &use_rje,2},null); }
使用R CMD SHLIB rje.c编译,并使用as
> dyn.load("rje.so") > .Call(".use_rje",getNativeSymbolInfo("rje")$address,"A User") Hello 'A User' NULL
以上是大佬教程为你收集整理的在C中调用R包中的C代码全部内容,希望文章能够帮你解决在C中调用R包中的C代码所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。