Sampel RcppArmadillo () ambigu setelah memperbarui R

9

Saya biasanya bekerja dengan fungsi Rcpp pendek yang mengambil input matriks di mana setiap baris berisi probabilitas K yang berjumlah 1. Fungsi kemudian sampel secara acak untuk setiap baris bilangan bulat antara 1 dan K sesuai dengan probabilitas yang disediakan. Ini fungsinya:

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

Saya baru saja memperbarui R dan semua paket. Sekarang saya tidak bisa mengkompilasi fungsi ini lagi. Alasannya tidak jelas bagi saya. Lari

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

melempar kesalahan berikut:

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

Ini pada dasarnya memberitahu saya bahwa panggilan saya RcppArmadillo::sample()tidak jelas. Adakah yang bisa menjelaskan mengapa ini terjadi?

Tuan Zen
sumber

Jawaban:

9

Ada dua hal yang terjadi di sini, dan dua bagian untuk masalah Anda dan karenanya jawabannya.

Yang pertama adalah "meta": mengapa sekarang ? Yah kami memiliki bug, biarkan dalam sample()kode / setup yang Christian perbaiki untuk rilis RcppArmadillo terbaru (dan semuanya didokumentasikan di sana). Singkatnya, antarmuka untuk argumen probabilitas yang memberi Anda masalah di sini telah diubah karena tidak aman untuk digunakan kembali / digunakan berulang kali . Sekarang.

Kedua, pesan kesalahan. Anda tidak mengatakan kompiler atau versi apa yang Anda gunakan tetapi milik saya (saat ini g++-9.3) sebenarnya cukup membantu dengan kesalahan tersebut. Ini masih C ++ sehingga beberapa tarian interpretatif diperlukan tetapi pada dasarnya itu jelas menyatakan Anda dipanggil Rcpp::Matrix<14>::Rowdan tidak ada antarmuka yang disediakan untuk jenis itu. Yang mana yang benar. sample()menawarkan beberapa antarmuka, tetapi tidak untuk Rowobjek. Jadi perbaikannya, sekali lagi, sederhana. Tambahkan baris untuk membantu kompiler dengan membuat baris NumericVectordan semuanya baik.

Kode tetap

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

Contoh

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Dirk Eddelbuettel
sumber