• 45.2.1 evalCpp() 转换单一计算表达式
  • 45.2.2 cppFunction() 转换简单的C++函数—Fibnacci例子
  • 45.2.3 sourceCpp() 转换C++程序—正负交替迭代例子
  • 45.2.4 sourceCpp() 转换C++源文件中的程序—正负交替迭代例子
  • 45.2.5 sourceCpp() 转换C++源程序文件—卷积例子
  • 45.2.6 随机数例子
  • 45.2.7 bootstrap例子
  • 45.2.8 在Rmd文件中使用C++源程序文件
  • 46 R与C++的类型转换
  • 46.1 wrap() 把C++变量返回到R中
  • 46.2 as() 函数把R变量转换为C++类型
  • 46.3 as() wrap() 的隐含调用
  • 47 Rcpp 属性
  • 47.1 Rcpp属性介绍
  • 47.2 在C++源程序中指定要导出的C++函数
  • 47.2.1 特殊注释 //[[Rcpp::export]]
  • 47.2.2 修改导出的函数名
  • 47.2.3 可导出的函数
  • 47.3 在R中编译链接C++代码
  • 47.3.1 sourceCpp() 函数中直接包含C++源程序字符串
  • 47.3.2 cppFunction() 函数中直接包含C++函数源程序字符串
  • 47.3.3 evalCpp() 函数中直接包含C++源程序表达式字符串
  • 47.3.4 depends 指定要链接的库
  • 47.4 Rcpp属性的其它功能
  • 47.4.1 自变量有缺省值的函数
  • 47.4.2 异常传递
  • 47.4.3 允许用户中断
  • 47.4.4 把R代码写在C++源文件中
  • 47.4.5 invisible 要求函数结果不自动显示
  • 47.4.6 在C++中调用R的随机数发生器
  • 48 Rcpp提供的C++数据类型
  • 48.1 RObject类
  • 48.2 IntegerVector类
  • 48.2.1 IntegerVector示例1:返回完全数
  • 48.2.2 IntegerVector示例2:输入整数向量
  • 48.3 NumericVector类
  • 48.3.1 示例1:计算元素 \(p\) 次方的和
  • 48.3.2 示例2: clone 函数
  • 48.3.3 示例3:向量子集
  • 48.4 NumericMatrix类
  • 48.4.1 示例1:计算矩阵各列模的最大值
  • 48.4.2 示例2:把输入矩阵制作副本计算元素平方根
  • 48.4.3 示例3:访问列子集
  • 48.5 Rcpp的其它向量类
  • 48.5.1 Rcpp的LogicalVector类
  • 48.5.2 Rcpp的CharacterVector类型
  • 48.6 Rcpp提供的其它数据类型
  • 48.6.1 Named类型
  • 48.6.2 List类型
  • 48.6.3 Rcpp的DataFrame类
  • 48.6.4 Rcpp的Function类
  • 48.6.5 Rcpp的Environment类
  • 49 Rcpp糖
  • 49.1 简单示例
  • 49.2 向量化的运算符
  • 49.2.1 向量化的四则运算
  • 49.2.2 向量化的赋值运算
  • 49.2.3 向量化的二元逻辑运算
  • 49.2.4 向量化的一元运算符
  • 49.3 用Rcpp访问数学函数
  • 49.4 用Rcpp访问统计分布类函数
  • 49.5 在Rcpp中产生随机数
  • 49.6 返回单一逻辑值的函数
  • 49.7 返回糖表达式的函数
  • 49.7.1 is_na
  • 49.7.2 seq_along
  • 49.7.3 seq_len
  • 49.7.4 pmin pmax
  • 49.7.5 ifelse
  • 49.7.6 sapply lapply
  • 49.7.7 sign
  • 49.7.8 diff
  • 49.8 R与Rcpp不同语法示例
  • 49.9 用RcppArmadillo执行矩阵运算
  • 49.9.1 生成多元正态分布随机数
  • 49.9.2 快速计算线性回归
  • 50 用Rcpp帮助制作R扩展包
  • 50.1 不用扩展包共享C++代码的方法
  • 50.2 生成扩展包
  • 50.2.1 利用已有基于Rcpp属性的源程序制作扩展包
  • 50.2.2 DESCRIPTION文件
  • 50.2.3 NAMESPACE文件
  • 50.3 重新编译
  • 50.4 建立C++用的接口界面
  • 51 R编程例子
  • 51.1 R语言
  • 51.1.1 用向量作逆变换
  • 51.1.2 斐波那契数列计算
  • 51.1.3 穷举所有排列
  • 51.1.4 可重复分组方式穷举
  • 51.1.5 升降连计数
  • 51.1.6 高斯八皇后问题
  • 51.1.7 最小能量路径
  • 51.2 概率
  • 51.2.1 智者千虑必有一失
  • 51.2.2 圆桌夫妇座位问题
  • 51.3 科学计算
  • 51.3.1 城市间最短路径
  • 51.3.2 Daubechies小波函数计算
  • 51.3.3 房间加热温度变化
  • 51.4 统计计算
  • 51.4.1 线性回归实例
  • 51.4.2 核回归与核密度估计
  • 51.4.3 二维随机模拟积分
  • 51.4.4 潜周期估计
  • 51.4.5 ARMA(1,1)模型估计
  • 51.4.6 VAR模型平稳性
  • 51.4.7 贮存可靠性评估
  • 51.5 数据处理
  • 51.5.1 小题分题型分数汇总
  • 51.5.2 类别编号重排
  • 51.6 文本处理
  • 51.6.1 用R语言下载处理《红楼梦》htm文件
  • 52 使用经验
  • 52.1 文件管理
  • 52.1.1 文件备份
  • 52.1.2 工作空间
  • 52.2 程序格式
  • A R Markdown文件格式
  • A.1 R Markdown文件
  • A.2 R Markdown文件的编译
  • A.2.1 编译的实际过程
  • A.3 在R Markdown文件中插入R代码
  • A.4 输出表格
  • A.5 利用R程序插图
  • A.6 冗余输出控制
  • A.7 代码段选项
  • A.7.1 代码和文本输出结果格式
  • A.7.2 图形选项
  • A.7.3 缓存(cache)选项
  • A.8 章节目录链接问题
  • A.9 其它编程语言引擎
  • A.10 交互内容
  • A.11 属性设置
  • A.11.1 YAML元数据
  • A.11.2 输出格式
  • A.11.3 输出格式设置
  • A.11.4 目录设置
  • A.11.5 章节自动编号
  • A.11.6 Word输出章节自动编号及模板功能
  • A.11.7 HTML特有输出格式设置
  • A.11.8 关于数学公式支持的设置
  • A.11.9 输出设置文件
  • A.12 LaTeX和PDF输出
  • A.12.1 TinyTex的安装使用
  • A.12.2 Rmd中Latex设置
  • A.13 生成期刊文章
  • A.14 附录:经验与问题
  • A.14.1 Word模板制作
  • A.14.2 数学公式设置补充
  • B 用bookdown制作图书
  • B.1 介绍
  • B.2 一本书的设置
  • B.3 章节结构
  • B.4 书的编译
  • B.5 交叉引用
  • B.6 数学公式和公式编号
  • B.7 定理类编号
  • B.8 文献引用
  • B.9 插图
  • B.10 表格
  • B.10.1 Markdown表格
  • B.10.2 kable() 函数制作表格
  • B.10.3 R中其它制作表格的包
  • B.11 数学公式的设置
  • B.12 使用经验
  • B.12.1 学位论文
  • B.12.2 LaTeX
  • B.12.3 算法
  • B.12.4 中文乱码
  • B.12.5 图片格式
  • B.12.6 其它经验
  • B.13 bookdown的一些使用问题
  • C 用R Markdown制作简易网站
  • C.1 介绍
  • C.2 简易网站制作
  • C.2.1 网站结构
  • C.2.2 编译
  • C.2.3 内容文件
  • C.2.4 网站设置
  • C.3 用blogdown制作网站
  • C.3.1 生成新网站的框架
  • C.3.2 网页内容文件及其设置
  • C.3.3 初学者的工作流程
  • C.3.4 网站设置文件
  • C.3.5 静态文件
  • D 制作幻灯片
  • D.1 介绍
  • D.2 Slidy幻灯片
  • D.2.1 文件格式
  • D.2.2 幻灯片编译
  • D.2.3 播放控制
  • D.2.4 生成单页HTML
  • D.2.5 数学公式处理与输出设置文件
  • D.2.6 其它选项
  • D.2.7 slidy幻灯片激光笔失效问题的修改
  • D.3 MS PowerPoint幻灯片
  • D.4 Bearmer幻灯片格式
  • D.5 R Presentation格式
  • References
  • 编著:李东风
  • Rcpp包为C++定义了NumericVector, IntegerVector, CharacterVector, Matrix等新数据类型, 可以直接与R的numeric, charactor, matrix对应。

    Rcpp最基础的R数据类型是RObject, 这是NumericVector, IntegerVector等的基类, 通常不直接使用。 RObject包裹了原来R的C API的SEXP数据结构, 并且提供了自动的内存管理, 不再需要用户自己处理建立内存和消除内存的工作。 RObject存储数据完全利用R C API的SEXP数据结构, 不进行额外的复制。

    因为RObject类是基类, 所以其成员函数也适用于NumericVector等类。 isNULL , isObject , isS4 可以查询是否NULL, 是否对象, 是否S4对象。 inherits 可以查询是否继承自某个特定类。 用 attributeNames , hasAttribute , attr 可以访问对象的属性。 用 hasSlot , slot 可以访问S4对象的插口(slot)。

    RObject有如下导出类:

  • IntegerVector: 整数向量;

  • NumercicVector: 数值向量;

  • LogicalVector: 逻辑向量;

  • CharacterVector: 字符型向量;

  • GenericVector: 列表;

  • ExpressionVector: 表达式向量;

  • RawVector: 元素为raw类型的向量。

  • IntergerMatrix, NumericMatrix: 整数值或数值矩阵。

  • 在R向量中,如果其元素都是同一类型(如整数、双精度数、 逻辑、字符型),则称为原子向量。 Rcpp提供了IntegerVector, NumericVector, LogicalVector, CharacterVector等数据类型与R的原子向量类型对应。 在C++中可以用 [] 运算符存取向量元素, 也可以用STL的迭代器。用 .begin() , .end() 等界定范围, 用循环或或者accumulate等STL算法处理整个向量。

    48.2 IntegerVector类

    在R中通常不严格区分整数与浮点实数, 但是在与C++交互时,C++对整数与实数严格区分, 所以RCpp中整数向量与数值向量是区分的。

    在R中,如果定义了一个仅有整数的向量, 其类型是整数(integer)的,否则是数值型(numeric)的,如:

    如果一个正整数等于它所有的除本身以外的因子的和, 称这个数为完全数。如

    \[\begin{aligned} 6 =& 1 + 2 + 3 \\ 28 =& 1 + 2 + 4 + 7 + 14 \\ \end{aligned}\]

    是完全数。

    任务:用C++程序输入前4个完全数偶数,返回到R中。 这4个数为6, 28, 496, 8182。

    任务:用C++编写函数,从R中输入整数向量, 计算其元素乘积(与R的 prod() 函数功能类似)。 程序如下:

    NumericVector类在C++中保存双精度型一维数组, 可以与R的实数型向量(class为numeric)相互转换。 这是自己用C++程序与R交互时最常用到的数据类型。

    x.size() 返回元素个数。

    48.3.1 示例1:计算元素 \(p\) 次方的和

    在自定义R函数时, 输入的自变量的值不会被改变, 相当于自变量都是局部变量。 如果在自定义函数中修改了自变量的值, 实际上只能修改自变量的一个副本的值。如

    C++中Rcpp支持的向量和列表, 仍可以用正整数向量作为下标。 下面的C++函数求指定的元素子集的和:

    NumericMatrix x(n,m) 产生一个未初始化的 \(n\times m\) 矩阵, 元素为 double 类型。 x.nrow() 返回行数, x.ncol() 返回列数, x.size() 返回元素个数。

    下标从0开始计算。 为了访问 \(x_{ij}\) , 用 x(i,j) 的格式: 注意, 不是 x[i,j] 也不是 x[i][j]

    为了访问 x 的第 i 行,用 x.row(i) x(i,_) ; 为了访问 x 的第 j 列,用 x.column(j) x(_,j)

    transpose(x) 返回 x 的转置。

    NumericMatrix::zeros(n) 返回 n 阶元素为0的方阵。 NumericMatrix::eye(n) 返回 n 阶单位阵。

    48.4.1 示例1:计算矩阵各列模的最大值

    输入一个矩阵,计算各列的向量模,并返回模的最大值。

    下面的例子输入一个R矩阵, 输出其元素的平方根, 用了clone函数来避免对输入的直接修改。 没有按行列循环而是将矩阵看作一个按列拉直的向量进行遍历, 矩阵实际上也是按向量存储的。

    可以用 x(_,j) 这样的格式将矩阵 x 的第 j 列取出为普通向量, 并可以赋值修改。 也可以用 x.column(j) , 用法相同。 x(i,_) 取出第 i 行为一个普通向量。 下面的C++函数将输入的矩阵的每一行计算累加和:

    48.5.1 Rcpp的LogicalVector类

    LogicalVector类可以存储C++值true, false, 还可以保存缺失值NA_REAL, R_NaN, R_PosInf, 但是这些不同的缺失值转换到R中都变成NA。

    CharacterVector类型可以与R的字符型向量相互交换信息, 在C++中其元素为字符串。 字符型缺失值在C++中为R_NAString。 R的字符型向量也可以转换为std::vector<:string>。

    Rcpp定义了 String 用来表示单个字符串。

    48.6.1 Named类型

    R中的向量、矩阵、数据框可以有元素名、列名、行名。 这些名字可以借助Named类添加。

    元素名 ”。

    Rcpp提供的List类型对应于R的list(列表)类型, 在C++中也可以写成GenericVector类型。 其元素可以不是同一类型, 在C++中可以用方括号和字符串下标的格式访问其元素。

    例如,下面的函数输入一个列表, 列表元素vec是数值型向量, 列表元素multiplier是数值型标量, 返回一个列表, 列表元素sum为vec元素和, 列表元素dsum为vec元素和乘以multiplier的结果:

    Rcpp的DataFrame类用来与R的data.frame交换信息。

    Rcpp的Function类用来接收一个R函数, 并且可以在C++中调用这样的函数。