8

Cコードで書かれたRパッケージを実装したいと思います。

C コードは次のことを行う必要があります。

  • 入力として (任意の型の) 配列を取ります。
  • (予測できないサイズの) 出力として配列を生成します。

配列の受け渡しを実装するベスト プラクティスは何ですか?

現時点では、C コードは で呼び出され.C()ます。ポインタを介してRから直接配列にアクセスします。残念ながら、出力のサイズを事前に知る必要があるため、出力に対して同じことを行うことはできませんが、これは私の場合には当てはまりません。

ファイルを介して C から R に配列を渡すことは理にかなっていますか? たとえば、ramfs で、Linux を使用している場合は?

更新 1: ここで、まったく同じ問題が議論されました。そこでは、次元が不明な配列を返す可能性のあるオプションが言及されました。

配列を計算する前で次元がわかっている時点で、外部関数を 2 つに分割します。最初の部分は次元を返し、次に空の配列が準備され、次に 2 番目の部分が実行され、R に配列が入力されます。
私の場合、完全な次元はコード全体が実行されたときにのみ知られるため、この方法は C コードを 2 回実行することを意味します。最大配列サイズを推測することもオプションではありません。

更新 2:これを行う唯一の方法は.Call()、電力が示唆するように、代わりに使用することです。いくつかの良い例を次に示します: http://www.sfu.ca/~sblay/RC-interface.ppt

ありがとう。

4

1 に答える 1

11

配列の受け渡しを実装するベスト プラクティスは何ですか?

パッケージはすでに ANSI C で書かれていますか? .C() は、迅速かつ簡単になります。

ゼロから作成する場合は、.Call() と Rcpp をお勧めします。このようにして、R オブジェクトを C/C++ コードに渡すことができます。

ファイルを介して配列を渡すことは理にかなっていますか?

いいえ

「R 拡張機能の作成」をお読みください。

于 2012-12-21T04:25:20.757 に答える