2016-10-25 1 views
-2

私はパッケージをCRANリポジトリに提出しました。パッケージはエラーなしで受け入れられましたが、CRANのメンテナを確認する第2ステップでは、次のエラーが報告されました。C++ Rパッケージエラー:ライブラリをアップロードする

残念ながら、私はそれをどのように修正できるのか分かりません。私のC++ファイルで

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 *, ...); 
     ^

は、私が書いた:

#include <math.h>  
#include "ANN/ANN.h"  
#include "NN.h" 
#include <R.h> 
#include "RcppArmadillo.h" 

#include <map> 
#include <vector> 
#include <iostream> 

どのように私はこれを修正する必要がありますか? Rpp.hはインクルードされていますか?

+2

あなたのタイトルは最も有益なものではありません。ほとんどの(?)CRANパッケージの著者は、Brian Ripleyからのメールを受け取りました。 – csgillespie

+1

私はこれもまた指摘していました。 –

答えて

8

R自体は、1990年代初めの早いスタートのためにC言語で書かれています。 Cには名前空間がありません。名前空間の分離がないため、競合が発生する可能性があります。同じ名前を持つ異なるライブラリの識別子は間違っている可能性があります。これはここで起こった。

Rは、そのC APIで、どのように一般的な名前が与えられているかに応じて、衝突する可能性のあるlength()error()などの機能を使用します。だから、RはそのシンボルにRf_を先行させるメカニズムとしてerrorRf_errorになる。これは、(コンパイラ自体を使用するのではなく)合理的に愚かなプリプロセッサを使用します。したがって、Rがerrorと表示された場合、それはRf_errorになります。ここでは何が起こる

あなたは可能性が非常に高い#include <RcppArmadillo.h>(およびインクルードは、あなたの実際のライブラリのために含ま前ので、暗黙の#include <Rcpp.h>を持っていることである。Rさんは、そのerror()をいじりその方法は、ライブラリーとは干渉しません。他の方法の周りにそれを試してみてください

+0

あなたが修正を提案した部分を追加しましたが、私はしませんでした。方法を理解する –

関連する問題