Использование colMeans в Rcpp - PullRequest
7 голосов
/ 09 января 2020

Я пытаюсь использовать R cpp, чтобы сделать выборку важности. Ключевой шаг - взять среднее значение весов важности (в этой задаче). Моя программа выполняет выборку важности для нескольких независимых переменных одновременно, поэтому код работает с матрицами, а не с векторами. Ниже приведен минимальный воспроизводимый пример, который является идеализированной версией того, что должно произойти:

library(Rcpp)

cppFunction('
NumericVector test(){
  NumericMatrix Numerator(100, 10);
  NumericMatrix Denominator(100, 10);

  for(int i = 0; i < 100; i++){
    Numerator(i,_) = log(runif(10));
    Denominator(i,_) = log(runif(10));
  }

  return colMeans(exp(Numerator - Denominator));
}
            ')

test()

Я получаю эту ошибку, которую я не понимаю:

file17dd7b43bf04.cpp:16:10: error: no matching function for call to 'colMeans'
  return colMeans(exp(Numerator - Denominator));
         ^~~~~~~~
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Rcpp/include/Rcpp/sugar/functions/rowSums.h:951:1: note: candidate template ignored: could not match 'MatrixBase' against 'Vectorized'
colMeans(const MatrixBase<RTYPE, NA, T>& x, bool na_rm = false) {
^

Внешне это выглядит компилятор пытается сказать мне, что он не знает, что такое функция colMeans, но а) я знаю, что это включено в сахар syntacti c, по крайней мере, для R cpp 1.0.3 и выше, и b ) вторичная ошибка, кажется, говорит о том, что я ввожу неверный аргумент. Я уверен, что мне просто не хватает чего-то простого, но я не уверен, что.

1 Ответ

6 голосов
/ 09 января 2020

Следуя предложению @ DirkEddelbuettel, следующая реконфигурация, кажется, делает компилятор счастливым:

library(Rcpp)

cppFunction('
  NumericVector test(){
    NumericMatrix Numerator(100, 10);
    NumericMatrix Denominator(100, 10);
    NumericMatrix Ratio(100, 10);

    for(int i = 0; i < 100; i++){
      Numerator(i,_) = log(runif(10));
      Denominator(i,_) = log(runif(10));
      Ratio(i,_) = exp(Numerator(i,_) - Denominator(i, _));
    }

    return colMeans(Ratio);
  }
')

test()
...