私はRプログラムから呼び出したいC言語の関数 "foo"を書きました。この関数は、入力として行列を取り込み、その上でいくつかの演算を行います(各要素に1を加える)。それは私が2次元配列を渡すにはどうすればよいR .Cインタフェース:多次元配列の受け渡し
void foo(int *nin, double *x)
{
int n = nin[0];
int i;
for (i=0; i<n; i++)
x[i] = x[i] * x[i];
}
として実装fooで
.C("foo", n=as.integer(5), x=as.double(rnorm(5)))
として単一のベクトルに簡単ですが? "double * x"を "double ** x"に変更すると、セグメンテーション違反が発生します。任意のポインタが高く評価されました。
'.Call'はない – transang
@transangを行いながら目標から渡されたオブジェクトを_modify_する場合' .C'は、CプログラムにPARAMをコピーするオーバーヘッド時間を追加し、結果をコピーバックと
Rの場合、Cでコピーする必要があります。コピーを '.C()'で自動的かつ安全に行うか、 '.Call()'でエラーを起こす可能性が高い手動で行うことができます。 Rcppのやり方では、Dirkの答えで 'Rcpp :: clone(M)'ステートメントにメモリコピーが必要です。もちろん、Rcppは深刻なCレベルの開発にとって素晴らしいことです。 –