Образец RcppArmadillo () неоднозначен после обновления R

9

Я обычно работаю с короткой функцией Rcpp, которая принимает в качестве входных данных матрицу, в которой каждая строка содержит K вероятностей, сумма которых равна 1. Затем функция случайным образом выбирает для каждой строки целое число от 1 до K, соответствующее предоставленным вероятностям. Это функция:

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

Я недавно обновил R и все пакеты. Теперь я не могу скомпилировать эту функцию больше. Причина не ясна для меня. Бег

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

выдает следующую ошибку:

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

Это в основном говорит мне, что мой призыв к RcppArmadillo::sample()неоднозначен. Может ли кто-нибудь объяснить мне, почему это так?

Мистер дзен
источник

Ответы:

9

Здесь происходят две вещи, и две части вашей проблемы и, следовательно, ответ.

Первый - «мета»: почему сейчас ? Ну, у нас была ошибка в sample()коде / настройке, которую Кристиан любезно исправил в последнем выпуске RcppArmadillo (и все это там задокументировано). Короче говоря, интерфейс для аргумента самой вероятности, доставляющего вам неприятности, был изменен, поскольку он не был безопасен для повторного использования / повторного использования . Сейчас.

Во-вторых, сообщение об ошибке. Вы не сказали, какой компилятор или версию вы используете, но моя (в настоящее время g++-9.3) на самом деле очень помогает с ошибкой. Это все еще C ++, поэтому необходим некоторый интерпретирующий танец, но в сущности он четко указывает, что вы звонили, Rcpp::Matrix<14>::Rowи интерфейс для этого типа не предусмотрен. Что правильно. sample()предлагает немного интерфейса, но ни один для Rowобъекта. Так что исправить, опять же, просто. Добавьте строку, чтобы помочь компилятору, сделав строку a, NumericVectorи все хорошо.

Фиксированный код

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

пример

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Дирк Эддельбюттель
источник