RcppArmadillos sample () ist nach der Aktualisierung von R nicht eindeutig

9

Ich arbeite üblicherweise mit einer kurzen Rcpp-Funktion, die als Eingabe eine Matrix verwendet, in der jede Zeile K Wahrscheinlichkeiten enthält, die sich zu 1 summieren. Die Funktion tastet dann für jede Zeile zufällig eine Ganzzahl zwischen 1 und K ab, die den bereitgestellten Wahrscheinlichkeiten entspricht. Dies ist die Funktion:

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

Ich habe kürzlich R und alle Pakete aktualisiert. Jetzt kann ich diese Funktion nicht mehr kompilieren. Der Grund ist mir nicht klar. Laufen

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

löst folgenden Fehler aus:

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

Dies sagt mir im Grunde, dass mein Anruf an nicht RcppArmadillo::sample()eindeutig ist. Kann mich jemand aufklären, warum dies der Fall ist?

Herr Zen
quelle

Antworten:

9

Hier passieren zwei Dinge und zwei Teile Ihres Problems und damit die Antwort.

Das erste ist "Meta": warum jetzt ? Nun, wir hatten einen Fehler im sample()Code / Setup, den Christian freundlicherweise für die neueste RcppArmadillo-Version behoben hat (und alles ist dort dokumentiert). Kurz gesagt, die Schnittstelle für das Wahrscheinlichkeitsargument, das Ihnen hier Probleme bereitet, wurde geändert, da es für die Wiederverwendung / wiederholte Verwendung nicht sicher war . Ist das jetzt.

Zweitens die Fehlermeldung. Sie haben nicht gesagt, welchen Compiler oder welche Version Sie verwenden, aber meiner (derzeit g++-9.3) ist tatsächlich ziemlich hilfreich bei dem Fehler. Es ist immer noch C ++, daher ist ein gewisser interpretativer Tanz erforderlich, aber im Wesentlichen wird deutlich, dass Sie angerufen haben, Rcpp::Matrix<14>::Rowund für diesen Typ ist keine Schnittstelle vorgesehen. Welches ist richtig. sample()bietet ein paar Schnittstellen, aber keine für ein RowObjekt. Die Lösung ist also wieder einmal einfach. Fügen Sie eine Zeile hinzu, um den Compiler zu unterstützen, indem Sie die Zeile a setzen, NumericVectorund alles ist gut.

Code behoben

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

Beispiel

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