Ошибка при попытке использовать функцию R в Rcpp в первый раз - PullRequest
1 голос
/ 24 октября 2019

Попытка скомпилировать в Rcpp функцию, которая возвращает пакет R с именем read_excel.

Не уверен, что означает ошибка, но, возможно, он не может найти функцию в пакете?

cppFunction('IntegerVector readYear(CharacterVector filePath ) {

 IntegerVector Year(filePath.size());
 int n=filePath.size();

 Environment pkg = Environment::namespace_env("readxl");

 Function read_excel=pkg["read_excel"];

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


 Year[i] = read_excel(Named("path") = filePath[i],
          _["range"] = "B3:B3",
          _["col_names"] = false );
 }
 return Year;
}')

Сообщение об ошибке:

file391220cd2e2.cpp: In function ‘Rcpp::IntegerVector readYear(Rcpp::CharacterVector)’:
file391220cd2e2.cpp:18:22: error: invalid conversion from ‘SEXP {aka SEXPREC*}’ to ‘Rcpp::traits::storage_type<13>::type {aka int}’ [-fpermissive]
  Year[i] = read_excel(Named("path") = filePath[i],
                      ^
make: *** [file391220cd2e2.o] Error 1
g++ -std=gnu++11 -I"/opt/R/3.6.0/lib/R/include" -DNDEBUG   -I"/home/rstudio-user/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include" -I"/tmp/RtmpbaxzNs/sourceCpp-x86_64-pc-linux-gnu-1.0.2" -I/usr/local/include  -fpic  -g -O2  -c file391220cd2e2.cpp -o file391220cd2e2.o
/opt/R/3.6.0/lib/R/etc/Makeconf:176: recipe for target 'file391220cd2e2.o' failed
Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir,  : 
  Error 1 occurred building shared library.

1 Ответ

3 голосов
/ 24 октября 2019

Сообщение об ошибке означает, что невозможно напрямую преобразовать тип возврата функции R (SEXP) в тип хранения IntegerVector (int). Вы можете указать Rcpp сделать это, используя Rcpp::as<int>(...):

Rcpp::cppFunction('IntegerVector readYear(CharacterVector filePath ) {

 int n = filePath.size();
 IntegerVector Year(n);

 Environment pkg = Environment::namespace_env("readxl");

 Function read_excel=pkg["read_excel"];

 for(int i =0; i<n; ++i){
   Year[i] = Rcpp::as<int>(read_excel(_("path") = filePath[i],
                                      _["range"] = "B3:B3",
                                      _["col_names"] = false ));
 }
 return Year;
}')

Кстати, я надеюсь, что есть веская причина сделать это в C ++, так как эта функция будет медленнее, чем эквивалентнаяФункция R, поскольку вызов функции R из C ++ имеет свою цену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...