A amostra de RcppArmadillo () é ambígua após a atualização do R

9

Normalmente, trabalho com uma função Rcpp curta que recebe como entrada uma matriz em que cada linha contém K probabilidades que somam 1. A função então amostra aleatoriamente para cada linha um número inteiro entre 1 e K correspondente às probabilidades fornecidas. Esta é a função:

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

Atualizei recentemente o R e todos os pacotes. Agora não posso mais compilar essa função. A razão não está clara para mim. Corrida

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

lança o seguinte erro:

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

Basicamente, isso me diz que minha ligação RcppArmadillo::sample()é ambígua. Alguém pode me esclarecer por que esse é o caso?

Mr. Zen
fonte

Respostas:

9

Há duas coisas acontecendo aqui, e duas partes para o seu problema e, portanto, a resposta.

O primeiro é "meta": por que agora ? Bem, tivemos um erro no sample()código / configuração que Christian gentilmente corrigiu para a versão mais recente do RcppArmadillo (e está tudo documentado lá). Em resumo, a interface do argumento de probabilidade muito problemática aqui foi alterada, pois não era seguro para reutilização / uso repetido . É agora.

Segundo, a mensagem de erro. Você não disse qual compilador ou versão usa, mas a minha (atualmente g++-9.3) é realmente bastante útil com o erro. Ainda é C ++, portanto, é necessária alguma dança interpretativa, mas, em essência, é claro que você ligou Rcpp::Matrix<14>::Rowe nenhuma interface é fornecida para esse tipo. Qual é correto. sample()oferece algumas interfaces, mas nenhuma para um Rowobjeto. Portanto, a correção é, mais uma vez, simples. Adicione uma linha para ajudar o compilador, tornando a linha a NumericVectore tudo está bom.

Código fixo

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

Exemplo

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