我正在使用RcppGSL围绕C库创建一个包装器包。当我尝试返回来自gsl_matrix *
的结果时遇到错误cannot convert const RcppGSL::matrix<double> to "SEXP" in initialization
以下是创建问题的代码
try {
exp.run_experiment(graphm_obj_A, graphm_obj_B);
gsl_matrix *tmp = exp.get_P_result(0) ;
RcppGSL::Matrix P(tmp); // ((gsl_matrix *) exp.get_P_result(0) ) ;
//const RcppGSL::matrix<double> P (gsl_matrix_
Rcpp::List res = Rcpp::List::create(
Rcpp::Named("debugprint_file") = algorithm_params["debugprint_file"],
//);
//
Rcpp::Named("Pmat") = P );
P.free();
return res;
} catch( std::exception &ex) {
Rf_error(ex.what());
} catch (...) {
return Rcpp::List();
}
如果我没有尝试返回P,则构建包没有错误。因此,wrap.h中的相关行(下面添加)表明这是由于不能隐式转换为SEXP。但我的理解是RcppGSL :: Matrix对象被隐式转换为SEXP对象。我缺少什么
/**
* This is the worst case :
* - not a primitive
* - not implicitely convertible tp SEXP
* - not iterable
*
* so we just give up and attempt to use static_assert to generate
* a compile time message if it is available, otherwise we use
* implicit conversion to SEXP to bomb the compiler, which will give
* quite a cryptic message
*/
template <typename T>
inline SEXP wrap_dispatch_unknown_iterable(const T& object, ::Rcpp::traits::false_type){
RCPP_DEBUG_1( "wrap_dispatch_unknown_iterable<%s>(., false )", DEMANGLE(T) )
// here we know that T is not convertible to SEXP
#ifdef HAS_STATIC_ASSERT
static_assert( !sizeof(T), "cannot convert type to SEXP" ) ;
#else
// leave the cryptic message
SEXP x = object ;
答案 0 :(得分:1)
这是一个非常小的例子,它将矩阵传递给GSL,通过将其添加到自身并将其返回来进行转换。
这一切都包含在这一个文件中:
#include <RcppGSL.h>
// [[Rcpp::depends(RcppGSL)]]
// [[Rcpp::export]]
RcppGSL::Matrix doubleMe(RcppGSL::Matrix X) {
RcppGSL::Matrix res = X;
gsl_matrix_add(res, X); // adds X to res
return res;
}
/*** R
M <- matrix(1:9, 3, 3)
doubleMe(M)
*/
,当来源时,不仅编译,链接和加载,而且还在底部标记的R注释中执行“单元测试”:
R> sourceCpp("/tmp/GSLmatrixEx.cpp")
R> M <- matrix(1:9, 3, 3)
R> doubleMe(M)
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
R>
从GSL获取矩阵确实没有复杂性。因为RcppGSL::Matrix
只是一个类型定义,因为你拥有的更为明确RcppGSL::matrix<double>
;它们当然是可以互换的。