2

私の目標は、R で C++ コードを使用してパッケージを作成することです。

C++ コードを含む R パッケージの作成に関するチュートリアルhttp://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdfに従っています。コンパイルしてパッケージ化しようとしている特定のコードは、チュートリアルで説明されているとおりです。

R CMD SHLIB は .dll ファイルの作成に取り組んでいるようです。dyn.load() を使用して R にロードし、シミュレートされたデータでテストできます (チュートリアルで説明されているように)。

R CMD INSTALL が問題の始まりです。関連すると思われる2つの異なるエラーが発生した2つのことを行いました。

1) チュートリアルでは、NAMESPACE ファイルには次のコードが含まれているはずだと書かれています。

useDynLib(XDemo)
export(XDemoAutoC)

R CMD INSTALL が失敗すると、エラーが発生します。

inDL(x,as.logical(local), as.logical(now),...) のエラー: 共有オブジェクト 'C:/.../libs/i386/XDemo.dll' を読み込めません: Loadlibrary の失敗: 1% は有効な Win32 プログラムではありません

2) NAMESPACE ファイルの上記の行を削除すると、パッケージがインストールされます。R に正常にロードできますが、C++ で記述された関数への .C() 呼び出しを行う R 関数を使用しようとすると、別のエラーが発生します。

library(newpackage)
ls(package:newpackage)
[[1]] "XDemoAutoC"
  Warning message:
 In ls(package:newpackage) :
 ‘package:newpackage’ converted to character string
 XDemoAutoC(c(1,2,3,4))
Error in .C("DemoAutoCor", OutVec = as.double(vector("numeric", OutLength)),  : 
 C symbol name "DemoAutoCor" not in load table

Windows 64 ビットでバージョン R2.15.2 を実行し、R64 ビットを使用しています。

同様の問題で次の投稿を読みました: http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021。 html

名前空間の問題については何も言及していないことを除いて。

また、この投稿を読みました: dyn.loadを使用してR x64でコンパイルされたcコードをロードする際の問題

だから私は考えています: Rx64 で dyn.load() を使用できるという事実に基づいて、x64 .dll を正常に作成したことを意味します。NAMESPACE ファイルがチュートリアルのように残されることになっていると仮定すると、>>not in load table<< エラーが修正されることを願っています - これは、問題 1 の修正に集中する必要があることを意味します。この問題は、32 ビットに関連する何かによって引き起こされているようです。.dll ファイルで Dependency Walker を使用しましたが、結果の解釈方法がわかりませんここに画像の説明を入力

私は本当にこの問題を解決する方法について何のアイデアも持っていないので、何をすべきかについての提案は大歓迎ですか?

4

1 に答える 1

2

私はあなたが間違っていると思います。2 つの簡単な提案:

  1. これを説明するために書かれたR 拡張機能の記述マニュアルを読んでください:コンパイル済みコードを含むR 拡張機能の記述

  2. Rcppを見てください。これにより、R および C++ の拡張機能が作成され、パッケージの構築が非常に簡単になります。またはそう思います。パッケージの作成は、 を呼び出すのと同じくらい簡単Rcpp.package.skeleton()です。1) のドキュメントは引き続き役立ちます。

とはいえ、R CMD INSTALL失敗した場合は、$PATH. MinGW と Cygwin を混在させないでください。R をビルドまたは呼び出すときに、Cygwin DLL が見つからないことを確認してください。パスの順序は非常に重要です。詳しくはマニュアルをご覧ください。

于 2013-03-28T01:50:07.013 に答える