Rcpp 快速入门

上传人:d****y 文档编号:98035593 上传时间:2019-09-07 格式:PPTX 页数:29 大小:124.99KB
返回 下载 相关 举报
Rcpp 快速入门_第1页
第1页 / 共29页
Rcpp 快速入门_第2页
第2页 / 共29页
Rcpp 快速入门_第3页
第3页 / 共29页
Rcpp 快速入门_第4页
第4页 / 共29页
Rcpp 快速入门_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Rcpp 快速入门》由会员分享,可在线阅读,更多相关《Rcpp 快速入门(29页珍藏版)》请在金锄头文库上搜索。

1、,Rcpp 快速入门,中国科学技术大学统计与金融系,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,Why and How,R 是解释性的语言, 所以运行速度比较慢,尤其是显示循环. 尽量用 R 提供的向量化运算策略, 使用 apply 系列函数. 可以通过借助其他编程语言 C, C+, Fortran 来提高程序的 运行效率. 由于 R 本身就是用 C, Fortran 写的, 所以 R 提供 C, C+, Fortran 的 各 种 API. R

2、 提供的 C API 对一般人而言很难上手, 而且操作复杂. 幸 运的是 Rcpp 为我们提供了很方便简单和高效的 C+ API. 你需要一个编译器, 推荐使用 gcc/g+, windows 用户可以 通过安装 Rtools 获得,Linux 一般自带. 你还需要安装 Rcpp 和 inline 包.,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作

3、as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,RObject 简介,Rcpp 中的基本类型是 RObject, 有点像 C 接口中的 SEXP (在标准的 C 接口中所有的 R 对象都是 SEXP), RObject 实 际上就是 SEXP 的一个 wraper. 上面的 Rcpp class 全都是 ROject 的子类,Rcpp 为 ROject 和 它的子类定义了许多方法, 使它们能够更加方便的使用. http:/ 上 看到所有这些类的定义和方法, 下面是个例子:,黄金山 Rcpp 快速入门,中国科学技术大学统计

4、与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,require(inline) robj.src -,RObject xnumvec(x); CharacterVector attrname = wrap(xnumvec.attributeNames(); CharacterVector xnames = xnumvec.attr(“names“); bool iss4 = xnumvec.isS4(); return List:create(_“x“ = xnumve

5、c, _“xattrname“=attrname, _“names“ = xnames, _“iss4“ = iss4); robj.test - cxxfunction(signature(x = “numeric“), + robj.src, plugin = “Rcpp“) x = c(a=3,b=4),黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,robj.test(x),$x a b 3 4 $xattrnam

6、e 1 “names“ $names 1 “a“ “b“ $iss4 1 FALSE attributes(x) $names 1 “a“ “b“,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,关于 Rcpp 各种数据 (RObject 的子类) 的处理, 下面是一个更为 详细的例子:,require(inline) mix.src - NumericMatrix nummat(rnumat); DateVector d

7、atevec(dvec); DatetimeVector dtvec(dt); DataFrame df(DF); List lst(2); lst0 = nummat(Range(1,2), Range(1,2); / nummat_,1 means the second colum lst1 = nummat(_,1); lst.push_back(datevec); lst.push_front(dtvec); / df1 or df“b“, apend with name “df$b“ lst.push_back(df1, “df$b“); return lst;,黄金山 Rcpp 快

8、速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,mix.test - cxxfunction(signature(rnumat = “numeric“,+ dvec = “Date“, + dt = “POSIXct“, + DF = “dataframe“), + mix.src, plugin = “Rcpp“),rummat - matrix(rnorm(3*3), 3, 3) dvec - as.Date(1:2, origin =

9、“1970-01-01“) dtvec - Sys.time() + 1:2 DF - data.frame(a = 1:2 , b = 4:5),黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,mix.test(rummat, dvec, dtvec, DF) 1 1 “2012-05-05 17:32:28 CST“ “2012-05-05 17:32:29 CST“ 2 ,1 ,2 1, -0.1569 0.4002

10、 2, 1.9407 0.2976 3 1 -0.4446 -0.1569 1.9407 4 1 “1970-01-02“ “1970-01-03“ $ df$b 1 4 5,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,需要注意的是在 C+ 下标是从 0 开始. 一般的向量 (Vector, List or Dataframe) 可以用 来做下标运算, 下标可 以是整数 (int) 也可以是字符串 (std:strin

11、g) 可以说和 R 中 的 下标运算完全一致.,矩阵运算的下标要用 (), 但是对于矩阵 (NumericMatrix) Rcpp 并不提供 R 中类似的各种运算, 如果有需要, 可以参考 RcppArmadillo package 或 者 是 RcppEigen package. Rcpp 的帮助文档 Rcpp-quickref.pdf 提供了关于各种数据类 型操作的简要说明, 相当于一个 reference card, 便于速查. 下面提供一个 RcppArmadillo 的例子, 你需要安装这个包.,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据

12、类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,RcppArmadillo,require(inline) arma.src (A); arma:mat Bm = as(B); arma:mat Cm = arma:trans(Am - Bm); NumericVector cv(Cm.begin(), Cm.end(); return cv; arma.test - cxxfunction(signature(A = “numeric“,B = “numeric“),arma.src, plugin = “

13、RcppArmadillo“),+ + + A = matrix(1:12, 3, 4) B = matrix(2:13, 3, 4) arma.test(A, B),1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,上面一节主要讲了如何用 Rcpp 提供的类处理 R 中的数据结构. 为了能够利用 C+ 中的数据结构和现成算法, 需要在 R 的数据

14、类型与 C+ 的数据类型做转换. as 的作用将 R 中的数据类型转换成 C+ 中的数据类型, 它是一 个模板函数:,/ conversion from R to C+ template T as(SEXP m_sexp); 我们还是通过 inline 的例子来说明使用方法:,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,as.src intvec = as (intx);,/ wrong way! std:vector

15、 impvec(intx); int N = as(n); int m = Rf_asInteger(n); /Rf_as* is C API List lst(N); lst0 = intvec; lst1 = m; return lst; as.test - cxxfunction(signature(intx = “integer“,n = “integer“), as.src, plugin=“Rcpp“),+ + intx - 1:10; n - 2 as.test(intx, n),1 1 1 2 3 4 5 6 7 8 9 10 2 1 2,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数据类型及操作 as 和 wrap 迭代器和泛型算法 调用 R 中的函数 Rcpp Sugar Rcpp Module, RInside,wrap 的作用是将 C+ 的数据类型转换成 R 的数据类型,方便将 C+ 的运算结果返回到 R 中,它也是一个模板函数:,/ conversion from C+ to R template SEXP wrap(const T 和 as 一样很多时候 wrap 都是隐式调用, 还是先看例子吧:,黄金山 Rcpp 快速入门,中国科学技术大学统计与金融系,背景和准备工作 Rcpp 数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 数据库

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号