我将我的包提交到CRAN存储库。该包被接受没有错误,但在检查CRAN维护者的第二步报告了以下错误。
不幸的是,我不明白如何解决它。
In file included from /Builds/CRAN-QA-Simon/packages/mavericks-x86_64/Rlib/3.3/RcppArmadillo/include/armadillo:23:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/fstream:864:20: error:
no member named 'Rf_error' in 'std::__1::codecvt_base'; did you mean simply 'Rf_error'?
if (__r == codecvt_base::error)
^~~~~~~~~~~~~~
/Library/Frameworks/R.framework/Resources/include/R_ext/Error.h:35:12: note:
'Rf_error' declared here
void NORET Rf_error(const char *, ...);
^
在我的C ++文件中,我写道:
#include <math.h>
#include "ANN/ANN.h"
#include "NN.h"
#include <R.h>
#include "RcppArmadillo.h"
#include <map>
#include <vector>
#include <iostream>
我该如何纠正?是否包含Rpp.h?
答案 0 :(得分:8)
R在其C API中使用函数length()
,error()
,....等等,考虑到名称的常见程度,可能会发生冲突。因此R具有将Rf_
添加到其符号的机制:error
变为Rf_error
。这使用预处理器,这是相当愚蠢的(与使用编译器本身相反)。因此,当R看到error
时,它希望它为Rf_error
。
这里发生的事情是你很可能#include <RcppArmadillo.h>
(因此隐含#include <Rcpp.h>
之前你的实际图书馆的包含。反过来尝试一下。方式R弄乱它的error()
不会干扰那个令你困惑的图书馆。