38 R与C++的类型转换
R程序与由Rcpp支持的C++程序之间需要传递数据, 就需要将R的数据类型经过转换后传递给C++函数, 将C++函数的结果经过转换后传递给R。
38.1 用wrap()
把C++变量返回到R中
在R API中用.Call()函数调用C程序库函数时,
R对象的数据类型一般是SEXP。
Rcpp提供了模板化的wrap()
函数把C++的函数返回值转换成R的SEXP数据类型。
此函数的声明为
wrap()
能转换的类型包括:
把int, double, bool等基本类型转换为R的原子向量类型 (所有元素数据类型相同的向量);
把
std::string
转换为R的字符型向量;把STL容器如
std::vector<T>
或std::map<T>
转换成基本类型为T的向量,条件是T能够转换;把STL的映射
std::map<std::string, T>
转换为基本类型为T的有名向量,条件是T能够转换;可以转换定义了
operator SEXP()
的C++类的对象;可以转换专门化过wrap模板的C++对象。
是否可用wrap()转换是在编译时确定的。
38.2 用as()
函数把R变量转换为C++类型
Rcpp提供了模板化的as()
用来把SEXP类型转换成适当的C++类型。
as()
函数的声明为:
as()
可以把R对象转换为基础的类型如
int, double, bool, std::string等,
可以转换到元素为基础类型的STL向量如std::vectoras()
来转换。
as()
可以针对用户自定义类作专门化。
38.3 as()
和wrap()
的隐含调用
当C++中赋值运算的右侧表达式是一个R对象或R对象的部分内容时,
可以隐含地调用as()
将其转换成左侧的C++类型。
当C++中赋值运算的左侧表达式是一个R对象或其部分内容时,
可以隐含地调用wrap()
将右侧的C++类型转换成R类型。
在用Rcpp属性(Rcpp属性见下一节)声明的C++函数中, 可以直接以IntegerVector, NumericVector, CharacterVector, Function 等作为自变量类型或返回值, 可以与R中相应的类型直接对应。
能自动转换到R中的缺省值类型还包括:
用双撇号界定的字符串常量;
十进数值如10, 4.5;
预定义的常数如true, false, R_NilValue, NA_STRING, NA_INTEGER, NA_REAL, NA_LOGICAL;