我一直在玩 Rcpp,目前出现了几个问题......
据我了解,如果你想向 R 公开一个 C++ 类,你需要为 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() ) ;
}
使用 internal::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 的全部内容......这里发生了什么?
谢谢!