Ошибка примера базовой числовой матрицы Rcpp

В настоящее время я пытаюсь выяснить, как использовать Rcpp, и изучал примеры, перечисленные на этом сайте. Я был в состоянии пройти через все примеры вплоть до примеров, включающих матрицы. Например, следующий код доставляет мне неприятности. Я разделил код в.r файл, указанный ниже

# rcpp_test.r     

require( Rcpp )


test<-function(x){

    cppFunction('NumericVector rowSumsC(NumericMatrix x) {

      int nrow = x.nrow(), ncol = x.ncol();

      NumericVector out(nrow);

      for (int i = 0; i < nrow; i++) {

        double total = 0;

        for (int j = 0; j < ncol; j++) {
          total += x(i, j);
        }

        out[i] = total;
      }

      return out;
   }')  

   return(rowSumsC(x))
}

Теперь, когда я делаю следующее, я получаю сообщение об ошибке

> source('rcpp_test.r')
   Loading required package: Rcpp
> x <- matrix(c(1,2,3,4,5,6,7,8,9), byrow=T, nrow=3)
> test(x)
   Error in rowSumsC(x) : 
 INTEGER() can only be applied to a 'integer', not a 'NULL'

Не уверен, где это: INTEGER() можно применять только к "целому числу", а не к ошибке "NULL", что печально, потому что заставить работать объект NumericMatrix было бы довольно круто. Любая помощь или совет будут оценены

Редактировать:

Я включил sessionInfo()

> sessionInfo()

R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_0.11.2

loaded via a namespace (and not attached):
[1] tools_3.1.1

1 ответ

Решение

Если я помещу ваш код в файл /tmp/rowSumC.cpp:

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector rowSumsC(NumericMatrix x) {
  int nrow = x.nrow(), ncol = x.ncol();
  NumericVector out(nrow);

  for (int i = 0; i < nrow; i++) {
    double total = 0;
    for (int j = 0; j < ncol; j++) {
      total += x(i, j);
    }
    out[i] = total;
  }
  return out;
}

тогда все работает просто отлично

R> library(Rcpp)
R> sourceCpp("/tmp/rowSumC.cpp")
R> rowSumsC(matrix(1:9,3))
[1] 12 15 18
R> 

Предположительно это будет работать так же cppFunction() который я склонен резервировать для действительно коротких функций из одной или двух строк.

Другие вопросы по тегам