Зразок 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> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.