有了hello world程序,那么就可以象之前一样来试试如何使用Rcpp书写c++代码了。
还是象之前介绍C一样的,我们只讲讲几种R基本类型数据的转入和输出。
test.cpp代码
#include <Rcpp.h> using namespace Rcpp; RcppExport SEXP convert(SEXP Rchar, SEXP Rint, SEXP Rdoub, SEXP Rlogi, SEXP Rchvec, SEXP Rnumvec, SEXP Rlogivec, SEXP Rnummat, SEXP Rchmat, SEXP Rlogimat) { const char* s = as<const char*>(Rchar); double f = as<double>(Rdoub); int n = as<int>(Rint); bool b = as<bool>(Rlogi); //vectors CharacterVector chVec(Rchvec); LogicalVector boolVec(Rlogivec); NumericVector doubleVect(Rnumvec); //matrix NumericMatrix doubleMat(Rnummat); LogicalMatrix boolMat(Rlogimat); CharacterMatrix chMat(Rchmat); //returned type will be converted by RcppExport macro. return List::create(Named("chVec")=chVec, Named("boolVec")=boolVec, Named("doubleVect")=doubleVect, Named("doubleMat")=Rnummat, Named("boolMat")=boolMat, Named("chMat")=chMat); } |
在terminal当前目录下运行
export PKG_LIBS=`Rscript -e "Rcpp:::LdFlags()"` export PKG_CXXFLAGS=`Rscript -e "Rcpp:::CxxFlags()"` R CMD SHLIB test.cpp |
或者
Rscript -e "Rcpp:::SHLIB('test.cpp')" |
之后就可以在R中检测这些代码了。
dyn.load("/path/to/your/code/test.so") .Call("convert","qiuworld",100,9.99,TRUE,letters[1:5],1:5,c(T,T,F,F),matrix(1:20,4,5),matrix(LETTERS[1:20],4,5),matrix(c(T,T,F,F),2,2)) |
further reading:
http://www.londonr.org/RomanFrancoisrcpp.pdf
http://rosuda.org/Packages%20and%20Interfaces.pdf
您好,我给您留过言,早就看到过你的帖子
我来自康奈尔大学 高山
我和国内几个人准备写一本r的书
您是否有兴趣
有空来我们qq群看看200956589
最大的生物信息群
我想问一下,怎么把建立好的R model转换成 C++呢? 我的邮箱是shengwen@live.cn
正在研究RCPP,和RSNNS包
您好。首先感谢您的留言。但是我不是太清楚您的问题。在R调用C的过程中,R还是R,C还是C它们之间各自保留各自的特点,只是在通讯的时候需要进行类型转换。你可以试着先从hello world程序开始。相信您很快就会上手的。