既存のRパッケージからスタンドアロンCライブラリを抽出するための推奨される方法?


8

私のグループは、植物の成長をシミュレートするためのRパッケージを開発していますGitHubレポジトリを参照)。Rパッケージは.CallCとのインターフェースに使用します。

スタンドアロンCライブラリを作成する価値があると判断しました。2つの主な理由は、1)使い慣れたCデバッグツールを使用すること、および2)開発者/ユーザーコミュニティの大部分がコンパイル済み言語に精通していることです(ほとんどのクラスのモデルはCまたはFortranで書かれています)。ただし、Rパッケージはこのコミュニティの外部の多くの人がアクセスできるため、その機能を維持したいと考えています。

Cライブラリの依存関係を持つRパッケージについて説明しているいくつかの関連する質問(https://stackoverflow.com/q/12328156/199217など)を確認しましたが、既存のRパッケージのデカップリングを特に扱う質問は見つかりませんでした。

提案されたアプローチ

(私たちがこれまでに思いついたこと...ストローマン)

  1. 既存の機能のテストを作成する
  2. Cライブラリをsrc/フォルダー内に保持する
  3. R固有のCコード(SEXPRライブラリの読み込みなど)を、先頭に「Rラッパー」ファイルを配置して配置します。R_*
  4. Cで構成ファイルを読み取るための個別の関数を作成する
  5. Rの機能を置き換える「メイン」のC関数を作成する
  6. Rラッパーファイルを無視するCライブラリのmakefileを書き込む
  7. Cライブラリが独立してRパッケージと同等に機能したら、C関数を別のリポジトリに移動することを検討できます。これはRパッケージの依存関係になります。

質問:

  1. この取り組みは見当違いですか?
  2. 潜在的な落とし穴を見落としていますか?
  3. RライブラリとCライブラリの両方を並行して開発するより良い方法はありますか?
  4. Rパッケージから分離されたCライブラリの例はありますか?
  5. RとCで同等の関数を比較するためのテストをどのように書けばよいでしょうか?

私はRの内部については知りませんが、一般に、ライブラリを一部のインタープリターに埋め込むことについて言えば、メモリ管理(つまり、ガベージコレクション)に多くの注意を払う必要があります
Basile Starynkevitch '28

回答:


2

一般的に言えば、これは良いアイデアであり、多くのパッケージがこれを行います。あなたはRSQLiteインスピレーションを得るために見るかもしれません-それらはパッケージ化されsqlite、いくつかのラッパー関数を含みます。同様rhdf5hdf5

あなたのポイントについて:

既存の機能のテストを作成する

常に良いアイデアです!

Cライブラリをsrc/フォルダー内に保持する

はい-またはinst/include、「ヘッダーのみ」のルートに行った場合は、アラRcpp

R固有のCコード(SEXPRライブラリの読み込みなど)を、先頭に「Rラッパー」ファイルを配置して配置します。R_*

十分に賢明なようです。

Cで構成ファイルを読み取るための個別の関数を作成する

ここで何を意味するのか正確にはわかりません。

Rの機能を置き換える「メイン」のC関数を作成する

これは私には奇妙に思えます。なぜ必要なのですかmain-呼び出し可能な関数のライブラリを開発しているだけではありませんか?Rをあなたにmain:)

Rラッパーファイルを無視するCライブラリのメイクファイルを作成する

はい、おそらくMakefileこれを処理するにはさらに複雑なものが必要になります。RSQLiteのソースコードを確認することをお勧めします。R-exts役立つ場合があります。

Cライブラリが独立してRパッケージと同等に機能したら、C関数を別のリポジトリに移動することを検討できます。これはRパッケージの依存関係になります。

はい、これは賢明なようです-パッケージをビルド/開発するときに、必要に応じてRパッケージにCソースコードを取得させます。このようにして、それらを効果的に分離することができます。


ありがとう。1)「Cで構成ファイルを読み取るための個別の関数」は、RでxmlToListを使用して入力ファイルを読み取る現在のアプローチの代替手段です。実行可能ファイルにファイル。
David LeBauer、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.