更新R后,RcppArmadillo的sample()不明确


9

我通常使用一个简短的Rcpp函数作为输入矩阵,其中每行包含K个合计为1的概率。然后,该函数为每行随机采样1到K之间与提供的概率相对应的整数。这是功能:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadilloExtensions/sample.h>

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0];
  }
  return result;
}

我最近更新了R和所有软件包。现在,我无法再编译此函数。我不清楚原因。跑步

library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")

引发以下错误:

error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous

这基本上告诉我,我的通话RcppArmadillo::sample()不明确。有人能启发我为什么会这样吗?

Answers:


9

这里发生两件事,而问题和答案则分为两部分。

首先是“元”:为什么现在呢?好吧,我们在sample()代码/设置中放了一个bug ,克里斯汀(Christian)为最新的RcppArmadillo版本修复了该错误(所有内容都记录在此)。简而言之,在这里给您带来麻烦的可能性极高的参数的界面已更改,因为它不安全,无法重用/重复使用。就是现在。

其次,错误信息。您没有说要使用什么编译器或版本,但是我的(当前g++-9.3是)实际上对于解决该错误很有帮助。它仍然是C ++,因此需要一些解释性的舞蹈,但是从本质上讲,它清楚地说明了您使用进行了调用,Rcpp::Matrix<14>::Row并且没有为该类型提供接口。哪个是对的。sample()提供了一些接口,但没有提供Row对象接口。因此,修复很简单。添加一行以使行成为a NumericVector,这一切都很好,以帮助编译器。

固定码

#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    Rcpp::NumericVector z(x(i, _));
    result[i] = RcppArmadillo::sample(choice_set, 1, false, z)[0];
  }
  return result;
}

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.