10

我很困惑。

以下编译和工作正常:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List test(){
    List l;
    IntegerVector v(5, NA_INTEGER);
    l.push_back(v);
    return l;
}

在 R 中:

R) test()
[[1]]
[1] NA NA NA NA NA

但是当我尝试IntegerVector在列表中设置时:

// [[Rcpp::export]]
List test(){
    List l;
    IntegerVector v(5, NA_INTEGER);
    l.push_back(v);
    l[0][1] = 1;
    return l;
}

它不编译:

test.cpp:121:8: error: invalid use of incomplete type 'struct SEXPREC'
C:/PROGRA~1/R/R-30~1.0/include/Rinternals.h:393:16: error: forward declaration of 'struct SEXPREC'
4

1 回答 1

16

这是因为这条线:

l[0][1] = 1;

编译器不知道这l是一个整数向量列表。本质上l[0]为您提供了一个SEXP(所有 R 对象的通用类型),并且SEXP是一个不透明的指针SEXPREC,我们无法访问它的定义(因此是不透明的)。因此,当您执行 时[1],您会尝试获得第二个SEXPREC,因此不透明度使其成为不可能,无论如何这不是您想要的。

您必须具体说明您正在提取IntegerVector,因此您可以执行以下操作:

as<IntegerVector>(l[0])[1] = 1;

或者

v[1] = 1 ;

或者

IntegerVector x = l[0] ; x[1] = 1 ;

所有这些选项都适用于相同的底层数据结构。

或者,如果您真的想要语法l[0][1],您可以定义自己的数据结构来表示“整数向量列表”。这是一个草图:

template <class T>
class ListOf {
public:

    ListOf( List data_) : data(data_){}

    T operator[](int i){
        return as<T>( data[i] ) ;
    }
    operator List(){ return data ; }

private:
    List data ;
} ;

您可以使用它,例如:

// [[Rcpp::export]]
List test2(){
    ListOf<IntegerVector> l = List::create( IntegerVector(5, NA_INTEGER) ) ; 
    l[0][1] = 1 ;
    return l;
}

另请注意,.push_backRcpp向量(包括列表)上使用需要列表数据的完整副本,这可能会降低您的速度。仅当您别无选择时才使用调整大小功能。

于 2013-07-01T16:27:33.763 回答