我一直在和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/