cppソースファイルで使用したいcoolStuff.h
関数を含むと呼ばれるヘッダーファイルがあります。awesomeSauce(arg1)
ディレクトリ構造:
- RworkingDirectory
- sourceCpp
- theCppFile.cpp
- cppHeaders
- coolStuff.h
- sourceCpp
コード:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
エラーが発生します:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
ファイルとディレクトリをあちこちに移動しましたが、これを機能させることができないようです。サードパーティのヘッダーを使用する場所のいたるところに、これを実行するという例があります。
#include <boost/array.hpp>
(Hadley / devtoolsからのもの)
https://github.com/hadley/devtools/wiki/Rcpp
では、何が得られるのでしょうか?私は午前中ずっと探していましたが、単純なことのように思えるものに対する答えを見つけることができません。
更新01.11.12
さて、RstudioでRcppを使用するパッケージを構築する方法を理解したので、質問を言い換えさせてください。cppコードで使用したい関数を含むスタンドアロンのヘッダーファイルcoolStuff.hがあります。
1)CoppFile.cppで使用できるように、パッケージディレクトリ構造のどこにcoolStuff.hを配置する必要がありますか?
2)cppファイルでcoolStuff.hを呼び出すにはどうすればよいですか?よろしくお願いします。前回の会話から多くのことを学びました。
注:「Rcppを使用するパッケージの作成」というビネットを読みましたが、その方法は説明されていません。
答え:
このページに散らばっているので、私の質問に対する答えを要約しましょう。詳細が間違っている場合は、これを編集するか、お知らせください。編集します。
そのため、で使用するために作成しているファイルで使用する関数またはその他のコードを含む.h
またはファイルが見つかりました。.cpp
.cpp
Rcpp
この見つかったコードcoolStuff.h
を呼び出し続け、使用する関数を呼び出しましょうawesomeSauce()
。あなたが書いているファイルを呼び出しましょうtheCppFile.cpp
。
(ここで、.hファイルと.cppファイルのコードはすべてC ++コードであり、それらの違いは、C++プログラマーが適切な方法で整理されていることです。違いについてはここで説明します。 、ただし、ここでSOを検索するだけで、違いについて説明できます。Rプログラマーが見つけたコードを少し使用する必要がある場合は、実際の違いはありません。)
短期間で:他のライブラリを呼び出さない場合と同様coolStuff.h
に、にカットアンドペーストするtheCppFile.cpp
か、パッケージを作成する場合は、ファイルを\src
含むディレクトリにファイルを配置して、ファイルの先頭でtheCppFile.cpp
使用することができます。#include "coolStuff.h"
あなたは書いている。後者はより柔軟性がありcoolStuff.h
、他の.cpp
ファイルの関数を使用できます。
詳細:
1)coolStuff.h
他のライブラリを呼び出さないでください。つまり、上部にincludeステートメントを含めることはできません。もしそうなら、私が以下に詳述することはおそらく機能しないでしょう、そして他のライブラリを呼び出す見つかったコードの使用はこの答えの範囲を超えています。
2)ファイルをコンパイルする場合は、にカットアンドペーストするsourceCpp()
必要があります。例外があると言われていますが、 1つのファイルをコンパイルするように設計されているため、これが最善の方法です。coolStuff.h
theCppFile.cpp
sourceCpp()
.cpp
(注:単純なカットアンドペーストがすぐに機能することを保証するものではありません。変数の名前を変更するか、使用しているデータ型を切り替えて、使用しているデータ型と一致させる必要がありますtheCppFile.cpp
。しかし、これまでのところ、カットアンドペーストは、6つの異なる単純な.h
ファイルで私にとって最小限の手間で機能しました)
3)どこからcoolStuff.h
でもコードを使用する必要がある場合は、それを切り取ってに貼り付ける必要があります。theCppFile.cpp
theCppFile.cpp
(繰り返しますが、カットアンドペーストに関する上記の注を参照してください)
4) ANDの他のファイルcoolStuff.h
に含まれているコードを使用する場合は、パッケージの作成を検討する必要があります。これは難しいことではありませんが、Rcppを使用したパッケージの構築に関する情報は、Rパッケージで必要な徹底的なドキュメント(ただし、初心者としては頭上にあります)から、初心者に敏感なものまでさまざまであるため、少し注意が必要です。イントロダクション(必要な詳細が省略される場合があります)。theCppFile.cpp
.cpp
これが私が提案するものです:
A)最初に、カットアンドペーストから、期待どおりにコンパイルおよび動作theCppFile.cpp
するコードを含むバージョンを取得します。これは必須ではありませんが、Rcpp ORパッケージを初めて使用する場合は、以下のより複雑なケースに進む前に、コードがこの単純な状況で機能することを確認しておくと便利です。coolStuff.h
theCppFile.cpp
sourceCpp()
B)Rcpp.package.skeleton()
RStudioのビルド機能を使用または使用してパッケージをビルドします(強くお勧めします)。hadley/devtoolsまたはRcppAttributesVignetteRcpp.package.skeleton()
での使用に関する詳細を見つけることができます。Rcppを使用してパッケージを作成するための完全なドキュメントは、Rcppを使用するパッケージの作成にありますが、これは、C ++の使い方をかなりよく知っていることを前提としており、Rcppを実行する新しい「属性」の方法を使用していません。
RStudioを使用している場合、またはRStudioを使用していない場合は、「ビルドとリロード」を忘れないでくださいcompileAttributes()
。
C)これで、\Rディレクトリに。というファイルが表示されますRcppExports.R
。それを開いてチェックしてください。ディレクトリにRcppExports.R
あるすべての.cppファイルのRラッパー関数が表示されます\src
。かなり甘い。
D)で書いた関数に対応するR関数を試してみてくださいtheCppFile.cpp
。それは機能しますか?もしそうなら、次に進みます。
coolStuff.h
E)パッケージを作成したら、。を使用してsrc
フォルダーに移動できますtheCppFile.cpp
。
F)これで、の直後に配置された(およびcoolStuff.hのコードを使用するその他の.cppファイル)theCppFile.cpp
の先頭にあるカットアンドペーストコードを削除できます。ranker.hの前後には角かっこはなく、「」があることに注意してください。これは、RcppやSTLなどのライブラリファイルではなく、ユーザーが提供するローカルファイルを含める場合のC++規則です。theCppFile.cpp
#include "coolStuff.h"
#include <Rcpp.h>
G)パッケージを再構築する必要があります。RStudioでは、これは[ビルド]メニューの[ビルドとリロード]です。RStudioを使用していない場合は、実行する必要がありますcompileAttributes()
H)ステップD)で行ったのと同じように、R関数を再試行します。うまくいけばうまくいきます。