L'esempio di RcppArmadillo () è ambiguo dopo l'aggiornamento di R


9

Lavoro comunemente con una breve funzione Rcpp che accetta come input una matrice in cui ogni riga contiene K probabilità che sommano a 1. La funzione quindi campiona casualmente per ogni riga un numero intero compreso tra 1 e K corrispondente alle probabilità fornite. Questa è la funzione:

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

Di recente ho aggiornato R e tutti i pacchetti. Ora non posso più compilare questa funzione. La ragione non mi è chiara. In esecuzione

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

genera il seguente errore:

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

Questo in sostanza mi dice che la mia chiamata a RcppArmadillo::sample()è ambigua. Qualcuno può illuminarmi sul perché questo è il caso?

Risposte:


9

Qui stanno accadendo due cose e due parti del tuo problema e quindi la risposta.

Il primo è "meta": perché adesso ? Beh, abbiamo avuto un bug lasciato entraresample() codice / installazione che Christian ha gentilmente corretto per l'ultima versione di RcppArmadillo (ed è tutto documentato lì). In breve, l'interfaccia per l'argomento molto probabile che ti dà problemi qui è stata cambiata in quanto non era sicura per il riutilizzo / uso ripetuto . È adesso.

Secondo, il messaggio di errore. Non hai detto quale compilatore o versione usi, ma il mio (attualmente g++-9.3) è in realtà abbastanza utile con l'errore. È ancora in C ++, quindi è necessaria una certa danza interpretativa, ma in sostanza afferma chiaramente che hai chiamato con Rcpp::Matrix<14>::Rowe nessuna interfaccia è fornita per quel tipo. Che è corretto.sample()offre alcune interfacce, ma nessuna per un Rowoggetto. Quindi la correzione è, ancora una volta, semplice. Aggiungi una riga per aiutare il compilatore rendendo la riga a NumericVectore tutto va bene.

Codice fisso

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

Esempio

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.