Ошибка примера базовой числовой матрицы 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()
который я склонен резервировать для действительно коротких функций из одной или двух строк.