2

複数の場所 ( R 拡張機能の作成やRcpp を使用したパッケージの作成など) を調べましたが、問題の簡単な例を見つけることができませんでした。
必要なのは、複数の cpp ソース ファイルを使用できるようにすることです。簡単な例は次のようになり
ます: 2 つのファイルがあるとしましょう: ああ、関数 f を定義する a.cpp (いくつかのデータを準備します)。
次に、ah ​​を含む b.cpp があります。これが行うことは、R にエクスポートされる関数 g を定義することです (つまり、これは Rcpp.h を含む唯一のファイルです)。この関数は f を呼び出し、f から作成したデータ フレームを返します。

a.cpp をコンパイルし、それを b.cpp にリンクして (f を呼び出せるように)、g を実行する方法が必要です。
実際には、a.cpp のペアの代わりに、外部で作成したプロジェクトがあります (Linux で makefile を使用)。ただし、同じファイルをコンパイルして、Windows でも b.cpp にリンクする必要があります (g++ を使用して適切にコンパイルできることがわかっています)。makefile を作成したときに、いくつかのフラグを追加しました (インクルード ディレクトリを定義するいくつかの -I フラグと、動作を定義するいくつかの -D フラグ)。
ただし、元のプロジェクトに実際に触れることはできません.bcと外部ファイルの追加のみです。

これを実現する簡単な方法を探していました。私が見た最も近いものは、Rcpp.package.skeleton を使用してファイルを含むパッケージを作成することでした。ただし、このアプローチにはいくつかの問題があります。

  1. 関連ファイルを参照する必要がありますが、Rcpp.package.skeleton はそれらをコピーします。ほとんどのcppファイル(つまり、Rに関連するすべてのメモ)は、リポジトリ内で独自の位置を占める別のプロジェクトに属しており、それらに触れたくありません(Windowsの混合環境を使用しているため、ソフトリンクも使用できません)および Linux)。

  2. 私の単純なニーズに対して少し複雑に見えるので、個別のパッケージを作成したくない

外部ライブラリをリンクできることはわかりましたが、R (特に Windows) と互換性のある方法でコンパイルする方法がわかりません。

これまでに見つけた唯一の簡単な解決策は、関連するすべての cpp ファイルを R 関連の cpp に直接含めることです (つまり、b.cpp の先頭に #include "a.cpp" を追加します。ファイルのリストは実際には変更されず、すべてが毎回コンパイルされるかどうかは気にしないでください)、sourceCpp を使用する前に Sys.setenv("PKG_CXXFLAGS"=myflags) を実行します。

よりエレガントな(そして複雑すぎない)ソリューションを見つけることをお勧めします。

4

1 に答える 1

1

mypackage/inst/includeヘッダー ファイルが にインストールされるようにする可能性を見逃していましたmypackage/include

その後の使用では、単にLinkingTo: mypackage、またはDepends属性を持つことができます。たとえば、Rcpp ギャラリーまたはここで多数の RcppArmadillo を使用した例を探してください。コピー ファイルはありません。

于 2013-10-15T15:09:59.730 に答える