在使用RcppArmadillo :: sample函数时,我发现使用大输入向量会导致RStudio崩溃。我提供以下完整代码:
#include<iostream>
#include <armadillo>
#include <RcppArmadilloExtensions/sample.h>
//[[Rcpp::depends(RcppArmadillo)]]
using namespace std;
using namespace Rcpp;
using namespace arma;
//[[Rcpp::export]]
IntegerVector test_func(int N) {
IntegerVector frame = Range(1, N);
NumericVector wts = runif(N, 0, 1);
NumericVector Wts = wts / sum(wts);
IntegerVector y = RcppArmadillo::sample(frame, N,TRUE, Wts );
return y;
}
调用test_func(N=100)
会产生正确的结果。但N大于200,例如test_func(N=210)
,会导致RStudio和RConsole崩溃。我正在犯错吗?
答案 0 :(得分:3)
我不能复制这个。无论是直接的R ression还是在RStudio里面它都适合我。
我对您的代码做了一些小修改:
// the following header also include Rcpp and Armadillo headers
#include <RcppArmadilloExtensions/sample.h>
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::export]]
Rcpp::IntegerVector test_func(int N) {
Rcpp::IntegerVector frame = Rcpp::Range(1, N);
Rcpp::NumericVector wts = Rcpp::runif(N, 0.0, 1.0);
return Rcpp::RcppArmadillo::sample(frame, N, true, wts / Rcpp::sum(wts));
}
但这些都不应该是重要的。
注意如果sample()
变大,N
函数的代码将如何引发激活:
if (walker_test < 200) {
ProbSampleReplace<IntegerVector>(index, nOrig, size, prob);
} else {
throw std::range_error("Walker Alias method not implemented. [...]");
}
所以我认为你可能会看到R,Rcpp,RcppArmadillo之间不匹配的花园种类错误。你在什么平台上?因为Linux是重新编译包的。