Пример кода Rcpp cppFunction

Я пытаюсь запустить код "Бесшовная интеграция R и C++ с Rcpp" (стр. 32, листинг 2.10), но он выдает ошибку. Может кто-нибудь объяснить мне, почему не работает? Спасибо

Code <- ' 
#include <gsL/gsl_const_mksa.h>           // decl of constants 
std::vector<double> volumes() { 
std::vector<double> v(5); 
v[0] = GSL_CONST_MKSA_US_GALLON;       // 1 US gallon 
v[1] = GSL_CONST_MKSA_CANADIAN_GALLON; // 1 Canadian gallon 
v[2] = GSL_CONST_MKSA_UK_GALLON;       // 1 UK gallon 
v[3] = GSL_CONST_MKSA_QUART;           // 1 quart 
v[4] = GSL_CONST_MKSA_PINT;            // 1 pint 
return v; 
}' 

gslVolumes <- cppFunction(code, depends="RcppGSL") 

Это ошибка сообщения:

file16e2b6cb966.cpp: In function ‘SEXPREC* sourceCpp_52966_volumes()’: 
file16e2b6cb966.cpp:30: error: ‘__result’ was not declared in this scope 
make: *** [file16e2b6cb966.o] Error 1 
llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include -I/usr/local/include  -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/RcppGSL/include"    -fPIC  -mtune=core2 -g -O2  -c file16e2b6cb966.cpp -o file16e2b6cb966.o 
Erro em sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput,  : 
  Error 1 occurred building shared library. 

person carlos1985    schedule 22.10.2013    source источник


Ответы (2)


Похоже, у вас опечатки:

Code <- ' 
#include <gsL/gsl_const_mksa.h>           // decl of constants 

Это должно быть code <- со строчной буквой c, а затем #include <gsl/gsl_const_mksa.h> со строчной буквой "ell".

В общем, я рекомендую включить подробный режим:

gslVolumes <- cppFunction(code, depends="RcppGSL", verbose=TRUE) 

который бы рассказал вам о

  1. object code not found с первой ошибки и

  2. file....cpp:10:63: fatal error: gsL/gsl_const_mksa.h: No such file or directory

об отсутствующем заголовке.

Но теперь я вижу, что с текущими версиями я также получаю __result not declared. Будет расследовать.

Изменить: ошибка/изменение. Это сработало, когда я писал главу, теперь вам нужно

  1. удалить строку с #include <gsl/gsl_const_mksa.h> из задания code

  2. добавьте новый аргумент includes=... к вызову cppFunction(), как показано ниже:

Исправлен вызов:

 gslVolumes <- cppFunction(code, depends="RcppGSL",
                           includes="#include <gsl/gsl_const_mksa.h>")
person Dirk Eddelbuettel    schedule 22.10.2013
comment
Есть ли страница с исправлениями/обновлениями для книги? Я посмотрел еще несколько мест, прежде чем нашел эту страницу SO. - person Ian Gow; 23.04.2014
comment
Нет, я немного отстал от его создания. Но если вы напишите мне, изменения в записях станут лучше, и я начну. К сожалению, не в ближайшие несколько недель. Что касается справки по Rcpp, документация указывает и будет указывать на список rcpp-devel. - person Dirk Eddelbuettel; 23.04.2014

В дополнение к тому, что сказал Дирк, я рекомендую вам преобразовать код в файл .cpp.

// [[Rcpp::depends(RcppGSL)]]
#include <Rcpp.h>
#include <gsl/gsl_const_mksa.h>           // decl of constants 

// [[Rcpp::export]]
std::vector<double> volumes() { 
  std::vector<double> v(5); 
  v[0] = GSL_CONST_MKSA_US_GALLON;       // 1 US gallon 
  v[1] = GSL_CONST_MKSA_CANADIAN_GALLON; // 1 Canadian gallon 
  v[2] = GSL_CONST_MKSA_UK_GALLON;       // 1 UK gallon 
  v[3] = GSL_CONST_MKSA_QUART;           // 1 quart 
  v[4] = GSL_CONST_MKSA_PINT;            // 1 pint 
  return v; 
}   

Затем вы можете sourceCpp этот файл.

person Romain Francois    schedule 22.10.2013
comment
Очень полезно; Я пробовал что-то похожее безуспешно, но это работает. Обратите внимание, что функция, полученная в результате sourceCppобработки этого файла, вызывается путем выдачи volumes() в R (а не gslVolumes() в исходном примере). - person Ian Gow; 23.04.2014