我有一个问题,我希望以特定方式组合所有相同类型的向量列表。我希望我的结果向量的第一个元素是我列表中第一个向量的第一个元素,第二个元素应该是第二个向量的第一个元素,第三个元素应该是第三个元素中的第一个元素,依此类推,直到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);
其中values
是List
的{{1}}。这似乎非常低效,每次都覆盖CharacterVectors
,但我不知道更好的方式来访问temp
中的元素。我不太了解很多C ++,但我认为必须有更好的方法。
非常感谢任何和所有帮助!
编辑:
&#39; values
中的所有向量都具有相同的长度values
,nrows
中有values
个元素。
答案 0 :(得分:5)
您需要的是ListOf<CharacterVector>
课程。顾名思义,它代表一个仅包含CharacterVector
的R列表。
下面的代码用它从列表中提取每个字符向量的第二个元素。不应该很难使它适应您的扩展算法,但是如果没有更多的上下文,您的示例是不可重现的。
#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 ;
}
然后,你sourceCpp
这个并尝试一些样本数据:
> data <- list(letters, letters, LETTERS)
> second(data)
[1] "b" "b" "B"
现在关于你的假设:
这似乎非常低效,每次都会覆盖临时温度
创建CharacterVector
非常快,没有深层数据副本,所以这应该不是问题。
答案 1 :(得分:1)
你可以预先构造向量,并且可以很容易地知道第一个向量的元素应该去哪个位置。即measure [0],measure [n],measure [n * 2]等等,其中n = mylist。尺寸()。当然,我假设列表中的每个向量具有相同的大小。未经测试的代码:
CharacterVector measure(nrows * expansion);
for(int i=0; i < values.size(); ++i)
{
CharacterVector& temp = values[i];
int newPosition = i;
for( int j=0; j < temp.size(); ++j)
{
measure[newPosition ] = temp[j];
newPosition += expansion;
}
}
return(measure);