2016-09-06 4 views
1

Rパッケージを作成するときに動的リンクライブラリ(.soファイル)をロードする適切な方法は何ですか?Rパッケージのダイナミックリンクライブラリへのディレクトリパスを設定する

dyn.load('/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.so')

明らかに、このアプローチは.soのため、CRAN/Bioconductorの提出のために動作しません。これまでの私のために働いている唯一の解決策は、例えば、.soファイルへのフルパスを指定することでしたファイルは配置されません。 、R: C symbol not in load table

1)library.dynam()

2)library.dynam('my_file.so')

3)library.dynam('my_file.so', 'R_PACKAGE')

4)system.file("src", "my_file.so", package = "R_PACKAGE")

関連リンク:このように、私は(失敗)は、以下の代替案を試してみましたR: C symbol name not in load table - error in linking with external .c files

私のRパッケージのユーザーは明らかに明確であるため、コンピュータ上の任意の作業ディレクトリを明示的に設定することができます。上記のようなフルパスアプローチは、作業ディレクトリを/FULL/PATH/TO/MY/R_PACKAGE/srcに設定すると唯一の方法です(これは当然実用的ではありません)。

答えて

1

これを行うための標準的な方法は、Writing R Extensionsで説明したように、次のとおりです。

1.5.4 useDynLib

NAMESPACEファイルをする必要が共有オブジェクトを可能にする1つの以上のuseDynLibディレクティブを含めることができますロードされた。*ディレクティブ

useDynLib(foo)

は、共有オブジェクトを登録foo **にはlibrary.dynamを読み込みます。登録されたオブジェクトのロードは、パッケージコードがロードされた後、ロードフック機能を実行する前に行われます。共有オブジェクトをロードするためのロード・フック関数のみが必要なパッケージでは、代わりにuseDynLibディレクティブを使用できます。

* NB:RディレクトリにRコードが含まれている場合、これはRのすべてのバージョンでのみ読み取られます。 **これは共有オブジェクトのベース名であり、適切な拡張子(.soまたは.dll)が追加されることに注意してください。

1

クイックポイント:

  • なぜあなたは.soファイルを出荷する必要がありますか?これは、あなたがsystem.file("src", "my_file.so", package="R_PACKAGE")を使用して、完全な/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.soを計算することができバイナリコンテンツ

  • を受け付けませんCRANのような一般的なリポジトリへのアップロードを妨げる

  • で(しかし、あなたは実際には標準ではありませんsrc/をインストールすることを確認してください) 他のすべてのケース(@BenBolkerによって指摘されているように)Rは動的ライブラリを作成して読み込む方法を知っています。コンパイルされたコードを持つすべてのパッケージはそれを行います。ソースコードをsrc/にドロップすると、(本質的に)完了しています。

関連する問題