RcppArmadilloのsample()はRを更新した後、あいまいになります


9

私は通常、各行に合計1のK確率が含まれている行列を入力として受け取る短いRcpp関数を使用します。この関数は、提供された確率に対応する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()が曖昧であることを示しています。なぜこれが事実であるかについて誰かが私を啓発できますか?

回答:


9

ここで2つのことが起こっており、問題に対する2つの部分、つまり答えがあります。

1つは「メタ」です。なぜ今なのでしょうか。さて、sample()コード/セットアップにバグがありましたが、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> 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.