如何更有效地访问列表中的向量中的元素?

sta*_*kam 2 c++ r rcpp

我有一个问题,我想以特定的方式组合所有相同类型的向量列表.我希望我的结果向量的第一个元素是我列表中第一个向量的第一个元素,第二个元素应该是第二个向量的第一个元素,第三个元素应该是第三个元素中的第一个元素,依此类推,直到n,其中n是我的列表的长度,然后元素n + 1应该是第一个向量的第二个元素.这重复直到完成.

目前,我这样做:

CharacterVector measure(nrows * expansion);
CharacterVector temp(nrows);
for(int i=0; i < measure.size(); i++){
  temp = values[i % expansion];
  measure[i] = temp[i / expansion];
}
return(measure);
Run Code Online (Sandbox Code Playgroud)

哪里valuesListCharacterVectors.这似乎非常低效,temp每次都要覆盖,但我不知道更好的方法来访问元素values.我不太了解很多C++,但我认为必须有更好的方法.

任何和所有的帮助非常感谢!

编辑:' values中的所有向量都具有相同的长度nrows并且values具有expansion元素.

Rom*_*ois 5

你需要的是ListOf<CharacterVector>课程.顾名思义,它代表一个只包含的R列表CharacterVector.

下面的代码使用它从列表中提取每个字符向量的第二个元素.不应该很难使它适应您的扩展算法,但是如果没有更多的上下文,您的示例是不可重现的.

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
CharacterVector second( ListOf<CharacterVector> values ){
    int n = values.size() ;
    CharacterVector res(n);
    for(int i=0; i<n; i++){
      res[i] = values[i][1] ;
    }
    return res ;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以sourceCpp尝试一些示例数据:

> data <- list(letters, letters, LETTERS)

> second(data)
[1] "b" "b" "B"
Run Code Online (Sandbox Code Playgroud)

现在关于你的假设:

这看起来非常低效,每次都会覆盖temp

创建一个CharacterVector非常快,没有深层的数据副本,所以这应该不是一个问题.