2014-10-15 4 views
-1

Я создал NumericVector, и мне нужно пробовать одно случайное целое из него. Я пытался использовать различные функции RcppArmarillo, но мне это не помогло. Эта функция приведена ниже:Rcpp R эквивалент образца от NumericVector

//#include <algorithm> 
#include <RcppArmadilloExtensions/sample.h> 
using namespace Rcpp; 
using namespace arma; 
using namespace std; 

int simulateNextStepC(double currentAmount, double lastPaid, int currentStatus, int currentMaturity, NumericMatrix amountLinkMatrix, NumericMatrix statusMatrix, double percentile4Capping=1, bool verbose=false) 
{ 
int nrow = amountLinkMatrix.nrow(), outsize; 

bool check; 
LogicalVector positionsToSample(nrow); 

for(int i=0;i< nrow;i++) { 
check=false; 
check=((statusMatrix(i,currentMaturity)==currentStatus)&&(is_finite(statusMatrix(i,currentMaturity+1)))); 
positionsToSample[i]=check; 
} 

outsize=sum(positionsToSample); 

IntegerVector historicalStatus(max(outsize,1)); 
int out; 
if(outsize==0) 
out=currentStatus; 
else { 
    for(int i=0, j=0; i<nrow; i++) { 
    if(positionsToSample[i]){ 
     historicalStatus[j]=statusMatrix(i,currentMaturity+1); 
     j++; 
    } 
    } 
    out=RcppArmadillo::sample(historicalStatus,1); // SAMPLING HERE 
}; 

возвращение; }

ответ

2

Есть несколько проблем с вашей функцией, что приводит к различным ошибкам.

  1. Вы должны иметь // [[Rcpp::depends(RcppArmadillo)]] в файле, как правило, помещается после вашего #include заявления. Без этого вы получите ошибку компиляции - fatal error: RcppArmadilloExtensions/sample.h: No such file or directory
  2. RcppArmadillo::sample(...) может возникнуть ошибка или, возможно, для вас. В this Rcpp Gallery post авторы используют RcppArmadillo::sample, предположительно, без проблем. Однако, я получил следующее сообщение об ошибке: error: reference to ‘RcppArmadillo’ is ambiguous out=RcppArmadillo::sample(historicalStatus,1);. Я решил это, используя вместо этого Rcpp::RcppArmadillo:sample; хотя мне кажется странным, учитывая, что декларация using namespace Rcpp; была на месте.
  3. В отличие от базовой функции R sample, я не думаю, что вы можете позвонить RcppArmadillo::sample только с двумя аргументами - при этом получилась следующая ошибка: error: no matching function for call to ‘sample(Rcpp::IntegerVector&, int)’. Это было решено путем подачи логического аргумента замены: Rcpp::RcppArmadillo::sample(historicalStatus,1,false)
  4. После внесения указанных изменений произошла ошибка: error: invalid user-defined conversion from ‘Rcpp::Vector<13, Rcpp::PreserveStorage>’ to ‘int’. Это легко можно установить, добавив Rcpp::as, то есть out=as<int>(Rcpp::RcppArmadillo::sample(historicalStatus,1,false));
  5. Я не уверен, что вы собираетесь экспортировать это в свою среду R в качестве автономной функции, но если это так, вам нужна // [[Rcpp::export]] над вашей функцией.

Я заметил, что три из вас аргументы были неиспользованными - lastPaid, percentile4Capping и verbose - Я предполагаю, что вы просто еще не было возможности реализовать их в теле вашей функции. Я не смог проверить это по фактическим данным, так как вы не представили никаких вопросов в своем вопросе, но после внесения изменений, отмеченных выше, это скомпилировано для меня:

#include <RcppArmadilloExtensions/sample.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
using namespace Rcpp; 
using namespace arma; 
using namespace std; 
// [[Rcpp::export]] 
int simulateNextStepC(double currentAmount, double lastPaid, 
         int currentStatus, int currentMaturity, 
         NumericMatrix amountLinkMatrix, 
         NumericMatrix statusMatrix, 
         double percentile4Capping=1, 
         bool verbose=false) 
{ 
    int nrow = amountLinkMatrix.nrow(), outsize; 

    bool check; 
    LogicalVector positionsToSample(nrow); 

    for(int i=0; i<nrow; i++) { 
    check = false; 
    check = ((statusMatrix(i,currentMaturity)==currentStatus) && 
      (is_finite(statusMatrix(i,currentMaturity+1)))); 
    positionsToSample[i] = check; 
    } 

    outsize = sum(positionsToSample); 

    IntegerVector historicalStatus(max(outsize,1)); 
    int out; 
    if(outsize==0) { 
    out=currentStatus; 
    } else { 
    for(int i=0, j=0; i<nrow; i++) { 
     if(positionsToSample[i]) { 
     historicalStatus[j]=statusMatrix(i,currentMaturity+1); 
     j++; 
     } 
    } 
    out=as<int>(Rcpp::RcppArmadillo::sample(historicalStatus,1,false)); 
    } 
    return out; 
}