簡體   English   中英

來自NumericVector的Rcpp R樣本等效項

[英]Rcpp R sample equivalent from a NumericVector

我已經創建了一個NumericVector,我需要從中采樣一個隨機的Integer。 我嘗試使用各種RcppArmarillo函數,但對我而言無效。 該功能如下:

//#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
};

返回 }

您的函數存在一些問題,導致不同的錯誤。

  1. 您需要在文件中添加// [[Rcpp::depends(RcppArmadillo)]] ,通常將其放置在#include語句之后。 沒有這個,您將得到一個編譯錯誤- fatal error: RcppArmadilloExtensions/sample.h: No such file or directory
  2. RcppArmadillo::sample(...)可能會或可能不會導致您出錯。 此Rcpp Gallery帖子中 ,作者大概使用RcppArmadillo::sample可能沒有問題。 但是,我收到以下錯誤消息: error: reference to 'RcppArmadillo' is ambiguous out=RcppArmadillo::sample(historicalStatus,1); 我通過使用Rcpp::RcppArmadillo:sample來解決此問題; 考慮到using namespace Rcpp;進行聲明,這對我來說似乎很奇怪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]]

我注意到您中的三個參數尚未使用lastPaidpercentile4Cappingverbose -我假設您還沒有機會在函數體中實現它們。 我無法在實際數據上對此進行測試,因為您沒有在問題中提供任何信息,但是在進行了上述更改之后,為我編譯了此代碼:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM