Próbka RcppArmadillo () jest niejednoznaczna po aktualizacji R.

9

Zwykle pracuję z krótką funkcją Rcpp, która przyjmuje jako dane wejściowe macierz, w której każdy wiersz zawiera prawdopodobieństwo K, które sumują się do 1. Funkcja następnie losowo sprawdza dla każdego wiersza liczbę całkowitą od 1 do K odpowiadającą podanym prawdopodobieństwom. To jest funkcja:

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

Niedawno zaktualizowałem R i wszystkie pakiety. Teraz nie mogę już skompilować tej funkcji. Powód nie jest dla mnie jasny. Bieganie

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

zgłasza następujący błąd:

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

To w zasadzie mówi mi, że moje wezwanie do RcppArmadillo::sample()jest niejednoznaczne. Czy ktoś może mnie oświecić, dlaczego tak jest?

Mr. Zen
źródło

Odpowiedzi:

9

Działają się tutaj dwie rzeczy, dwie części twojego problemu i stąd odpowiedź.

Pierwszy to „meta”: dlaczego teraz ? Cóż, mieliśmy błąd w sample()kodzie / konfiguracji, który Christian uprzejmie naprawił dla najnowszej wersji RcppArmadillo (i wszystko jest tam udokumentowane). Krótko mówiąc, interfejs argumentu bardzo prawdopodobnego powodującego kłopoty został zmieniony, ponieważ nie był bezpieczny do ponownego użycia / wielokrotnego użycia . To jest teraz.

Po drugie, komunikat o błędzie. Nie powiedziałeś, jakiego kompilatora lub wersji używasz, ale mój (obecnie g++-9.3) jest naprawdę bardzo pomocny w przypadku błędu. Nadal jest to C ++, więc potrzebny jest taniec interpretacyjny, ale w gruncie rzeczy wyraźnie mówi on, że zostałeś wywołany Rcpp::Matrix<14>::Rowi nie ma interfejsu dla tego typu. Który jest poprawny. sample()oferuje kilka interfejsów, ale żaden dla Rowobiektu. Zatem poprawka jest po raz kolejny prosta. Dodaj wiersz, aby pomóc kompilatorowi, tworząc wiersz NumericVectora wszystko jest w porządku.

Naprawiono kod

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

Przykład

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Dirk Eddelbuettel
źródło