5

我一直在玩 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 的全部内容......这里发生了什么?

谢谢!

4

1 回答 1

2

有一个完整的小插图讨论如何编写as<>()wrap()--- Rcpp 扩展小插图。

正如它所讨论的,部分专业化只是三种方法之一,还有其他示例包。 Date()是 Rcpp 本身实现的东西,所以它不是最好的例子。阅读小插图,研究其他示例并在 rcpp-devel 上提问。

于 2013-05-11T11:51:45.067 回答