我一直在玩Rcpp,目前正在出现一些问题......
根据我的理解,如果要将C ++类公开给R,则需要为Rcpp :: wrap和Rcpp :: as编写部分模板特化。我看了如何在Rcpp :: Date类中完成这个,我有以下问题: - 在Date.h中我们有:
// template specialisation for wrap() on the date
// OK as explained in docs for non intrusive
// partial template specialization
template <> SEXP wrap<Rcpp::Date>(const Rcpp::Date &date);
在标题的下方,您有以下代码:
template<> inline SEXP wrap_extra_steps<Rcpp::Date>( SEXP x ){
Rf_setAttrib( x, R_ClassSymbol, Rf_mkString( "Date" ) ) ;
return x ;
}
wrap_extra_steps应该做什么?需要吗?同样在Date.cpp中,wrap方法实现如下:
template <> SEXP wrap(const Date &date) {
return internal::new_date_object( date.getDate() ) ;
}
将内部:: new_date_object实现为:
SEXP new_date_object( double d){
SEXP x = PROTECT(Rf_ScalarReal( d ) ) ;
Rf_setAttrib(x, R_ClassSymbol, Rf_mkString("Date"));
UNPROTECT(1);
return x;
}
好的我明白SEXP是创建并返回给R的,但是我没有完全了解PROTECT(),Rf_setAttrib,UNPROTECT ......这里发生了什么?
谢谢!
答案 0 :(得分:2)
有一个完整的小插图讨论如何写as<>()
和wrap()
--- Rcpp延伸的小插图。
正如它所讨论的,部分专业化只是三种方法之一,也有其他示例包。 Date()
是Rcpp自己实现的东西,所以它不是最好的例子。阅读小插图,研究其他示例并询问rcpp-devel。