第一部分 简介 1
第1章 Rcpp简介 3
1.1 背景:从R到C++ 3
1.2 示例一 7
1.2.1 问题设置 7
1.2.2 R解决方案之一 8
1.2.3 C++解决方案之一 9
1.2.4 使用inline扩展包 10
1.2.5 使用Rcpp attributes 12
1.2.6 R解决方案之二 13
1.2.7 C++解决方案之二 14
1.2.8 R解决方案之三 16
1.2.9 C++解决方案之三 16
1.3 示例二 17
1.3.1 问题设置 17
1.3.2 R解决方案 18
1.3.3 C++解决方案 19
1.3.4 比较 20
1.4 小结 20
第2章 工具与设置 21
2.1 整体设置 21
2.2 编译器 22
2.2.1 一般设置 22
2.2.2 平台相关的注意事项 23
2.3 R应用程序接口(API) 25
2.4 首次使用Rcpp进行编译 25
2.5 inline扩展包 27
2.5.1 概览 28
2.5.2 使用includes 31
2.5.3 使用plugin 32
2.5.4 制作plugin 33
2.6 Rcpp attributes 35
2.7 异常处理 36
第二部分 核心数据类型 41
第3章 数据结构:第一部分 43
3.1 RObject类 43
3.2 IntegerVector类 45
3.2.1 示例一:返回完美数 46
3.2.2 示例二:使用输入 47
3.2.3 示例三:使用错误的输入 48
3.3 NumbericVector类 50
3.3.1 示例一:使用两个输入 50
3.3.2 示例二:引入clone 50
3.3.3 示例三:矩阵 53
3.4 其他向量类 54
3.4.1 LogicalVector 54
3.4.2 CharacterVector 55
3.4.3 RawVector 55
第4章 数据结构:第二部分 56
4.1 Named类 56
4.2 List类,又名GenericVector类 58
4.2.1 从R中接受参数的List 58
4.2.2 使用List返回参数给R 59
4.3 DataFrame类 60
4.4 Function类 62
4.4.1 示例一:使用用户提供的函数 62
4.4.2 示例二:访问R函数 63
4.5 Environment类 63
4.6 S4类 64
4.7 ReferenceClasses 66
4.8 R数学库函数 67
第三部分 进阶话题 69
第5章 在扩展包中使用Rcpp 71
5.1 简介 71
5.2 使用Rcpp.package.skeleton 72
5.2.1 概述 72
5.2.2 R代码 74
5.2.3 C++代码 74
5.2.4 DESCRIPTION 76
5.2.5 Makevars和Makevars.win 76
5.2.6 NAMESPACE 78
5.2.7 帮助文件 78
5.3 案例学习:wordcloud扩展包 80
5.4 进一步的示例 82
第6章 扩展Rcpp 83
6.1 简介 83
6.2 扩展Rcpp::wrap 84
6.2.1 侵入式扩展 85
6.2.2 非侵入式扩展 85
6.2.3 模板与局部特化 86
6.3 扩展Rcpp::as 86
6.3.1 侵入式扩展 87
6.3.2 非侵入式扩展 87
6.3.3 模板与局部特化 87
6.4 案例学习:RcppBDT扩展包 89
6.5 进一步的示例 91
第7章 Modules 92
7.1 动机 92
7.1.1 使用Rcpp导出函数 92
7.1.2 使用Rcpp导出类 93
7.2 Rcpp Modules 96
7.2.1 使用Rcpp Modules导出C++函数 96
7.2.2 使用Rcpp Modules导出C++类 101
7.3 在其他扩展包中使用module 110
7.3.1 命名空间的导入导出 110
7.3.2 扩展包框架生成器对module的支持 112
7.3.3 module文档 112
7.4 案例学习:RcppCNPy扩展包 112
7.5 进一步的示例 115
第8章 Sugar 116
8.1 动机 116
8.2 运算符 118
8.2.1 二元算术运算符 118
8.2.2 二元逻辑运算符 119
8.2.3 一元运算符 120
8.3 函数 121
8.3.1 产生单一逻辑结果的函数 121
8.3.2 产生sugar表达式的函数 122
8.3.3 数学函数 128
8.3.4 d/q/p/r统计函数 129
8.4 性能 131
8.5 实现 132
8.5.1 CRTP模式 132
8.5.2 VectorBase类 133
8.5.3 实例:sapply 134
8.6 案例学习:使用Rcpp sugar计算π 139
第四部分 应用 143
第9章 RInside 145
9.1 动机 145
9.2 示例一:Hello, World! 146
9.3 示例二:数据传输 149
9.4 示例三:对R表达式求值 151
9.5 示例四:C++通过R作图 152
9.6 示例五:在MPI中使用RInside 153
9.7 其他示例 155
第10章 RcppArmadillo 157
10.1 概述 157
10.2 动机:FastLm 159
10.2.1 实现 159
10.2.2 性能比较 160
10.2.3 一个警告 163
10.3 案例学习:使用RcppArmadillo实现卡尔曼滤波 166
10.4 RcppArmadillo和Armadillo之间的区别 174
第11章 RcppGSL 176
11.1 简介 176
11.2 动机:FastLm 177
11.3 向量 179
11.3.1 GSL向量 180
11.3.2 RcppGSL::vector 181
11.3.3 对应 183
11.3.4 向量视图(vector view) 183
11.4 矩阵 185
11.4.1 生成矩阵 185
11.4.2 隐式转换 185
11.4.3 索引 185
11.4.4 方法 186
11.4.5 matrix view类 186
11.5 在自己的扩展包里使用RcppGSL 186
11.5.1 configure脚本 187
11.5.2 src文件夹 189
11.5.3 R文件夹 190
11.6 通过inline使用RcppGSL 190
11.7 案例:使用RcppGSL实现基于GSL的B-样条拟合 192
第12章 RcppEigen 202
12.1 简介 202
12.2 Eigen类 203
12.2.1 固定大小的向量和矩阵 203
12.2.2 动态大小的向量和矩阵 204
12.2.3 用于预制组件操作的数组 206
12.2.4 向量、矩阵和特殊矩阵的映射对象 206
12.3 案例学习:使用RcppEigen实现卡尔曼滤波 207
12.4 线性代数和矩阵分解 210
12.4.1 基本求解器 210
12.4.2 特征值和特征向量 211
12.4.3 最小二乘求解器 212
12.4.4 显秩分解 212
12.5 案例学习:RcppEigen中用于线性模型的C++工厂 214
附录A R程序员的C++入门 223
A.1 编译而不是解释 223
A.2 静态类型 225
A.3 一个更好的C 226
A.4 面向对象编程(但与S3或S4不同) 229
A.5 泛型编程和STL 230
A.6 模板编程 232
A.7 C++的进一步推荐读物 234
参考文献 235
主题索引 241
软件索引 247
作者索引 249