r语言 - 使用冒号 (':') 访问数组中的元素 C++ (在 Rcpp 中)

r - Using colon (':') to access elements in an array in C++ (in Rcpp)

本文关键字:语言 元素 C++ Rcpp 数组 访问      更新时间:2023-10-16

我正在尝试运行以下代码。坦率地说,我知道C++很少,但我想运行以下函数。你能帮我运行这个愚蠢的例子吗?

cppFunction(
'NumericVector abc(int x, int x_end, NumericVector y)
{
NumericVector z;
int x1 = x + x_end;
z = y[x:x1];
return(z);  
}'
)
abc(3,c(0,1,10,100,1000,10000))

我看到这个...

错误:在":"令牌之前应为"]">

更新对不起,我忘了提到我需要生成从xx1的数字序列。该函数IntegerVector::create仅创建一个只有x的变量,x1x1x。我举的例子是微不足道的。我现在更新了示例。我需要C++seq()R中做什么

基于以下答案的解决方案 (@SleuthEye)

Rcpp::cppFunction(
'NumericVector abc(int x, int x_end, NumericVector y)
{
NumericVector z;
Range idx(x,x_end);
z = y[idx];
return(z);  
}'
)
abc(3,5,c(0,1,10,100,1000,10000))
[1]   100  1000 10000

RcppcppFunction的代码参数必须包含有效的C++代码。该库试图使尽可能无缝,但仍仅限于C++的语法。更具体地说,C++没有范围运算符(:),相应地,C++编译器告诉你索引表达式必须是一个有效的索引(括在[]内,没有:)。索引的类型可以是intIntegerVector,但不能包含:字符。

但是,正如 Rcpp 子集文章中所建议的那样,您可以创建一个表示所需(x,x+1)范围的向量,然后您可以使用该向量来索引NumericVector变量:

IntegerVector idx = IntegerVector::create(x, x+1);
z = y[idx];

更一般地说,您可以以类似的方式使用Range

Range idx(x, x1);
z = y[idx];