获取错误无法将const RcppGSL :: matrix <double>转换为&#34; SEXP&#34;在初始化

时间:2016-11-17 01:57:56

标签: r rcpp r-package

我正在使用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 ;

1 个答案:

答案 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>;它们当然是可以互换的。