gpt4 book ai didi

r - 如何访问 Rcpp::List 中向量的元素

转载 作者:行者123 更新时间:2023-12-04 03:15:59 24 4
gpt4 key购买 nike

我很困惑。

以下编译和工作正常:

#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'

最佳答案

这是因为这一行:

l[0][1] = 1;

编译器不知道 l是一个整数向量列表。本质上 l[0]给你一个 SEXP (所有 R 对象的通用类型)和 SEXP是指向 SEXPREC 的不透明指针其中我们无法访问 te 定义(因此不透明)。所以当你做 [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向量(包括列表)需要列表数据的完整副本,这可能会导致速度变慢。仅在您别无选择时才使用调整大小功能。

关于r - 如何访问 Rcpp::List 中向量的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17407762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com