La muestra de RcppArmadillo () es ambigua después de actualizar R

9

Comúnmente trabajo con una función Rcpp corta que toma como entrada una matriz donde cada fila contiene K probabilidades que suman 1. La función muestra aleatoriamente para cada fila un número entero entre 1 y K correspondiente a las probabilidades proporcionadas. Esta es la función:

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

Recientemente actualicé R y todos los paquetes. Ahora ya no puedo compilar esta función. La razón no está clara para mí. Corriendo

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

arroja el siguiente error:

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

Esto básicamente me dice que mi llamada a RcppArmadillo::sample()es ambigua. ¿Alguien puede aclararme por qué este es el caso?

Señor zen
fuente

Respuestas:

9

Aquí hay dos cosas que suceden, y dos partes de su problema y, por lo tanto, la respuesta.

El primero es "meta": ¿por qué ahora ? Bueno, tuvimos un error en el sample()código / configuración que Christian corrigió amablemente para la versión más reciente de RcppArmadillo (y todo está documentado allí). En resumen, la interfaz para el argumento de probabilidad que le da problemas aquí se cambió ya que no era segura para su reutilización / uso repetido . Esto es ahora.

En segundo lugar, el mensaje de error. No dijiste qué compilador o versión usas, pero el mío (actualmente g++-9.3) es bastante útil con el error. Todavía es C ++, por lo que se necesita algo de baile interpretativo, pero en esencia indica claramente que llamaste Rcpp::Matrix<14>::Rowy no se proporciona ninguna interfaz para ese tipo. Cual es correcta. sample()ofrece algunas interfaces, pero ninguna para un Rowobjeto. Entonces, la solución es, una vez más, simple. Agregue una línea para ayudar al compilador haciendo que la fila ay NumericVectortodo esté bien.

Código fijo

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

Ejemplo

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