代码之家  ›  专栏  ›  技术社区  ›  liori

当将Rcpp对象传递给另一个对象时,new \u CppObject \u xp错误地报告错误

  •  3
  • liori  · 技术社区  · 6 年前

    我有两个Rcpp包装类, A B . 的构造函数从参数中提取一些信息,并打印出来以证明它是有效的。

    B 取一个物体 作为构造函数参数,并报告一个错误,就像在 A A

    我怎么才能得到 B A

    library(Rcpp)
    
    Rcpp::sourceCpp(code='
    #include <Rcpp.h>
    
    struct A {
      Rcpp::NumericVector y;
    
      A(Rcpp::List x)
        : y(Rcpp::as<Rcpp::NumericVector>(x["foo"]))
      {
        Rcpp::Rcout << y;
      }
    };
    
    struct B {
      B(A x) { }
    };
    
    RCPP_MODULE(A) {
      Rcpp::class_<A>("A")
      .constructor<Rcpp::List>();
    }
    
    RCPP_MODULE(B) {
      Rcpp::class_<B>("B")
      .constructor<A>();
    }
    ')
    
    Aobj <- new(A, list(foo=1:3))
    Bobj <- new(B, Aobj)
    

    输出:

    > source('testcase.R', echo=TRUE)
    
    > library(Rcpp)
    
    > Rcpp::sourceCpp(code='
    + #include <Rcpp.h>
    + 
    + struct A {
    +   Rcpp::NumericVector y;
    + 
    +   A(Rcpp::List x)
    +     : y(Rcpp::as<Rcpp::NumericVector> .... [TRUNCATED] 
    
    > Aobj <- new(A, list(foo=1:3))
    1 2 3
    > Bobj <- new(B, Aobj)
    Error in new_CppObject_xp(fields$.module, fields$.pointer, ...) : 
      Index out of bounds: [index='foo'].
    > 
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Ralf Stubner    6 年前

    我来解释原因 your solution RCPP_MODULE(A) 您正在暴露C++结构 A 作为R中的一个参考类。这是自动完成的。但是,当你打电话的时候 Bobj <- new(B, Aobj) 没有信息如何从这个引用类转换为所需的C++结构。通过使用 RCPP_EXPOSED_CLASS(A) 你正在创造 Rcpp::wrap Rcpp::as 用两种方式在C++和R对象之间转换。因为我们只缺了R到C++的转换,即 Rcpp::作为 ,以下内容也足够了:

    #include <RcppCommon.h>
    struct A;
    RCPP_EXPOSED_AS(A)
    
    #include <Rcpp.h>
    
    struct A {
      Rcpp::NumericVector y;
    
      A(Rcpp::List x)
        : y(Rcpp::as<Rcpp::NumericVector>(x["foo"]))
      {
        Rcpp::Rcout << y;
      }
    };
    
    struct B {
      B(A x) { }
    };
    
    RCPP_MODULE(A) {
      Rcpp::class_<A>("A")
      .constructor<Rcpp::List>();
    }
    
    RCPP_MODULE(B) {
      Rcpp::class_<B>("B")
      .constructor<A>();
    }
    
    /*** R
    Aobj <- new(A, list(foo=1:3))
    Bobj <- new(B, Aobj)
    */
    
        2
  •  3
  •   liori    6 年前

    当事情不顺利时,最好(重新)阅读一些文档。明确地, Rcpp Extending (PDF)

    我在C++代码的开头添加了以下内容:

    #include <RcppCommon.h>
    struct A;
    RCPP_EXPOSED_CLASS(A);
    

    现在一切正常。我承认我还不完全理解这里发生了什么,但是这个解决方案同时解决了MWE和我的原始代码问题。