在 C++ 中使用冒号(':')访问数组中的元素(在 Rcpp 中)
Using colon (':') to access elements in an array in C++ (in Rcpp)
我正在尝试 运行 以下代码。坦率地说,我对 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))
我看到这个...
错误:在“:”令牌之前应为“]”
更新
抱歉,我忘了说我需要生成一个从 x
到 x1
的数字序列。函数 IntegerVector::create
只创建一个只有 x
和 x1
而不是 x
虽然 x1
的变量。我举的例子很简单。我现在更新了示例。我需要在 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
Rcpp
的 cppFunction
的代码参数必须包含有效的 C++ 代码。该库试图尽可能无缝,但仍受限于 C++ 的语法。更具体地说,C++ 没有范围运算符 (:
),相应地,C++ 编译器会告诉您索引表达式必须是有效索引(包含在 []
中,没有 :
) .索引的类型可以是 int
或 IntegerVector
,但不能包含 :
字符。
正如 Rcpp subsetting article 中所建议的那样,您可以创建一个表示所需 (x,x+1)
范围的向量,然后您可以使用它来索引 NumericVector
变量:
IntegerVector idx = IntegerVector::create(x, x+1);
z = y[idx];
更一般地说,您可以以类似的方式使用 Range
:
Range idx(x, x1);
z = y[idx];
我正在尝试 运行 以下代码。坦率地说,我对 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))
我看到这个...
错误:在“:”令牌之前应为“]”
更新
抱歉,我忘了说我需要生成一个从 x
到 x1
的数字序列。函数 IntegerVector::create
只创建一个只有 x
和 x1
而不是 x
虽然 x1
的变量。我举的例子很简单。我现在更新了示例。我需要在 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
Rcpp
的 cppFunction
的代码参数必须包含有效的 C++ 代码。该库试图尽可能无缝,但仍受限于 C++ 的语法。更具体地说,C++ 没有范围运算符 (:
),相应地,C++ 编译器会告诉您索引表达式必须是有效索引(包含在 []
中,没有 :
) .索引的类型可以是 int
或 IntegerVector
,但不能包含 :
字符。
正如 Rcpp subsetting article 中所建议的那样,您可以创建一个表示所需 (x,x+1)
范围的向量,然后您可以使用它来索引 NumericVector
变量:
IntegerVector idx = IntegerVector::create(x, x+1);
z = y[idx];
更一般地说,您可以以类似的方式使用 Range
:
Range idx(x, x1);
z = y[idx];