R调用c++ 4

有了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))

4 thoughts on “R调用c++

  1. Reply 高山 7月 12,2012 4:13 下午

    您好,我给您留过言,早就看到过你的帖子
    我来自康奈尔大学 高山
    我和国内几个人准备写一本r的书
    您是否有兴趣
    有空来我们qq群看看200956589
    最大的生物信息群

  2. Reply shengwen 5月 21,2013 12:03 下午

    我想问一下,怎么把建立好的R model转换成 C++呢? 我的邮箱是shengwen@live.cn
    正在研究RCPP,和RSNNS包

    • Reply admin 5月 21,2013 8:23 下午

      您好。首先感谢您的留言。但是我不是太清楚您的问题。在R调用C的过程中,R还是R,C还是C它们之间各自保留各自的特点,只是在通讯的时候需要进行类型转换。你可以试着先从hello world程序开始。相信您很快就会上手的。

Leave a Reply

  

  

  

%d 博主赞过: