使用 Rcpp 返回列表中向量的大小



我希望下面的代码返回列表内向量的大小。 使用 Rcpp 编译时,它会返回错误‘Rcpp::Vector<19>::Proxy’ {aka ‘class Rcpp::internal::generic_proxy<19>’} has no member named ‘size’

我做错了什么?

library(Rcpp)
cppFunction("
int f() {
List X(2);
X[0] = rep(0,2);
X[1] = rep(0,3);
return X[0].size();
}")
f()

更新

我找到了一个解决方案:在返回之前投射 X[0]。 代码如下:

cppFunction("
int f() {
List X(2);
X[0] = rep(0,2);
X[1] = rep(0,3);
return ((IntegerVector)X[0]).size();
}")

首先,我建议从包inline迁移到 Rcpp 属性。我们大多数人在 2013 年或 2014 年左右这样做;请参阅更新的介绍小插曲。

其次,你的函数是正确的;以下(略微修改(的版本在一个列表中返回两个向量:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List f() {
List X(2);
X[0] = rep(0,2);
X[1] = rep(0,3);
return X;
}
/*** R
f()
*/

但是,编写模板表达式很难。你的想法没有错,但有时编译器需要帮助。 例如,首先将向量分配给对象NumericVectors然后查询它们的大小就可以了---然后您可以将它们分配给列表:

// [[Rcpp::export]]
List g() {
IntegerVector v0 = rep(0,2);
IntegerVector v1 = rep(0,3);
Rcout << "Sizes are " << v0.size() << " and " << v1.size() << std::endl;
return List::create(v0, v1);
}

同时运行两者(在最后还添加了对g()的调用之后(,我得到:

R> sourceCpp("~/git/stackoverflow/61994530/answer.cpp")
R> f()
[[1]]
[1] 0 0
[[2]]
[1] 0 0 0

R> g()
Sizes are 2 and 3
[[1]]
[1] 0 0
[[2]]
[1] 0 0 0
R> 

最新更新