Rcpp代码示例cppFunction

时间:2013-10-22 00:59:07

标签: c++ r rcpp

我正在尝试运行“使用Rcpp进行无缝R和C ++集成”的代码(第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. 

2 个答案:

答案 0 :(得分:4)

看起来你有错别字:

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

应该{​​{1}}使用小写code <-,然后c使用小写'ell'。

一般情况下,我建议打开详细模式:

#include <gsl/gsl_const_mksa.h>

本来会告诉你的事情

    第一个错误中的
  1. gslVolumes <- cppFunction(code, depends="RcppGSL", verbose=TRUE)

  2. object code not found

  3. 关于丢失的标题。

    但我现在确实看到,对于当前版本,我也得到了file....cpp:10:63: fatal error: gsL/gsl_const_mksa.h: No such file or directory。将 调查。

    编辑:这是一个错误/更改。它在我写这一章时起作用了,现在你需要

    1. __result not declared作业

    2. 中移除#include <gsl/gsl_const_mksa.h>
    3. code电话添加新的includes=...参数,如下所示:

    4. 更正了电话:

      cppFunction()

答案 1 :(得分:3)

除了Dirk所说的,我建议您将代码提升为.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该文件。