2015-05-05 24 views
4

我試圖運行下面的代碼。坦率地說,我只知道C++很少,但我想要得到以下函數運行。你能幫我運行這個愚蠢的例子嗎?使用冒號(':')在C++中訪問數組中的元素(在Rcpp中)

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僅創建一個變量,只有xx1而不是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 
+2

我不是太熟悉RCPP,但[此鏈接](http://gallery.rcpp.org/articles/subsetting/)表明它可以與像'IntegerVector IDX完成= IntegerVec TOR ::創建(X,X 1); z = y [idx];' – SleuthEye

+0

這也是一個有趣的閱讀:[埃裏克Niebler在C++中的一片Python](http://ericniebler.com/2014/12/07/a-slice-of-python- in-c /) – nonsensation

回答

6

代碼參數RcppcppFunction必須包括有效的C答案

解決方案做++碼。該庫試圖儘可能無縫,但仍然限於C++的語法。更具體地說,C++沒有範圍運算符(:),相應地C++編譯器會告訴您索引表達式必須是有效索引(包含在[]之內,不包含:)。索引的類型可以是intIntegerVector,但不能包含:字符。

爲暗示在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]; 
+0

對不起@SleuthEye,我需要生成一個從'x'到'x1'的序列('x1'不一定是'x + 1'。任何在C++中的方法。 –