2013-05-15 39 views
0

RCPP的錯誤,我已經寫了有RCPP和C++ R一些代碼,試圖更加熟悉它:糖都()線

#include <Rcpp.h> 
#include <vector> 

using namespace Rcpp; 

// [[Rcpp::export]] 
CharacterMatrix reduce_sequences(CharacterMatrix completeDNA) 
{ 
    std::vector<int> informativeSites; 
    for(int i = 0; i < completeDNA.ncol(); i++) 
    { 
    CharacterVector bpsite(completeDNA.nrow()); 
    for(int n = 0; n < completeDNA.nrow(); n++) 
    { 
     bpsite[n] = completeDNA(n,i); 
    } 
    if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i); 
    } 
    CharacterMatrix cutDNA(3, informativeSites.size()); 
    for(int i = 0; i < informativeSites.size(); i++) 
    { 
    for(int n = 0; n < cutDNA.nrow(); n++) 
    { 
     cutDNA(n,i) = completeDNA(n,informativeSites[i]); 
    } 
    } 
    return cutDNA; 
} 

但我得到一個COMPLE錯誤,但不是從我的源文件,但來自Comparator_With_One_Value.h:

我不會假裝完全理解這些錯誤,因爲我仍然處於C++初期階段,但通過適當評論我的代碼並找出導致它的原因,它是我的第17行:

if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i); 

我認爲它與我使用任何()。我做錯了什麼?

編輯:更改的行反映的所有問題解決以上但有兩個: 控制檯輸出:

Error in Rcpp::sourceCpp("reduceseq.cpp") : 
    Error 1 occurred building shared library. 

問題從Comparator_With_One_Value.h operands to ?: have different types 'SEXPREC*' and 'int'invalid conversion from 'SEXPREC* const' to 'int'

感謝, 奔回來了。

回答

2

我們防止這種情況的,因爲3個值R邏輯的目的:TRUEFALSENA。你應該能夠這樣使用is_true

if(any(bpsite != bpsite[0]).is_true()) informativeSites.push_back(i); 
+0

嗨,這得到擺脫的問題,但有兩個其他人仍然在錯誤輸出。這些在Comparitor_With_One_Value.h中,並且仍然是由這一行引起的 - 如果我刪除註釋,那麼錯誤就會停止。 '操作數?有不同類型的「SEXPREC *」和「int」'和'無效的從「SEXPREC * const」到「int」的轉換。它似乎認爲在這一行我將一個SEXP轉換爲一個整數,但該行使用的數據類型是std :: vector和一個'CharacterVector'。 '我'哪個被推回到'std :: vector '也是'int',除非我錯了(可能!)。 – Ward9250

+0

用此行更新原始代碼塊。 – Ward9250

+0

我剛剛在rcpp-devel上回答了這個問題,以及我在這裏沒有看到您的問題。 *請選擇一個*,清單或SO,但是*不要交叉郵件*。我們通常會推薦rcpp-devel,但這是您的選擇。 –