我一直在和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() ) ;
}

内部的:: 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的全部内容,这是怎么回事?

谢谢!

最佳答案

整个小插图都在讨论如何编写as<>()wrap()(Rcpp扩展小插图)。

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

关于c++ - 用Rcpp公开C++类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16496577/

10-12 21:32
查看更多