我很困惑.
以下编译和工作正常:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List test(){
List l;
IntegerVector v(5, NA_INTEGER);
l.push_back(v);
return l;
}
Run Code Online (Sandbox Code Playgroud)
在R:
R) test()
[[1]]
[1] NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)
但是当我尝试IntegerVector
在列表中设置时:
// [[Rcpp::export]]
List test(){
List l;
IntegerVector v(5, NA_INTEGER);
l.push_back(v);
l[0][1] = 1;
return l;
}
Run Code Online (Sandbox Code Playgroud)
它不编译:
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'
Run Code Online (Sandbox Code Playgroud)
Rom*_*ois 16
正是因为这条线:
l[0][1] = 1;
Run Code Online (Sandbox Code Playgroud)
编译器不知道它l
是整数向量的列表.本质上l[0]
为您提供了SEXP
(所有R对象的泛型类型),并且SEXP
是一个不透明的指针SEXPREC
,我们无法访问te定义(因此不透明).因此,当你这样做的时候[1]
,你试图得到第二个SEXPREC
,所以不透明度使它变得不可能,而且它不是你想要的.
你必须明确提取一个IntegerVector
,所以你可以这样做:
as<IntegerVector>(l[0])[1] = 1;
Run Code Online (Sandbox Code Playgroud)
要么
v[1] = 1 ;
Run Code Online (Sandbox Code Playgroud)
要么
IntegerVector x = l[0] ; x[1] = 1 ;
Run Code Online (Sandbox Code Playgroud)
所有这些选项都适用于相同的底层数据结构.
或者,如果您真的想要语法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 ;
} ;
Run Code Online (Sandbox Code Playgroud)
您可以使用哪种,例如:
// [[Rcpp::export]]
List test2(){
ListOf<IntegerVector> l = List::create( IntegerVector(5, NA_INTEGER) ) ;
l[0][1] = 1 ;
return l;
}
Run Code Online (Sandbox Code Playgroud)
另请注意,.push_back
在Rcpp
向量(包括列表)上使用需要列表数据的完整副本,这可能会导致速度变慢.只有在没有选择时才使用调整大小功能.
归档时间: |
|
查看次数: |
2014 次 |
最近记录: |