私はRcppフリーのC/C++エクステンション(ライセンスのために)として書き直さなければならないRcppコードをたくさん持っていて、幸いにもそれは恐ろしいほど痛いほどのものではありません。しかし、最もクリーンなコードを書くために、私はPROTECT/UNPROTECTを過度に使用していないことを確認したい。文書Writing R Extensionsは、「目に見えるものをすべて保護するのは良い考えではありません...」と述べていますので、私は義務づけようとしています。.Call引数を保護する必要がありますか?
ここで確認したいことがあります。 RのC拡張を書くすべての例を読むと、著者が渡された関数の引数を保護する例がたくさんありました。これはthis articleから取ったものです。
#include <R.h>
#include <Rdefines.h>
#include <string.h>
SEXP helloC1(SEXP greeting) {
int i, vectorLength, stringLength;
SEXP result;
PROTECT(greeting = AS_CHARACTER(greeting));
vectorLength = LENGTH(greeting);
PROTECT(result = NEW_INTEGER(vectorLength));
for (i=0; i<vectorLength; i++) {
stringLength = strlen(CHAR(STRING_ELT(greeting, i)));
INTEGER(result)[i] = stringLength;
}
UNPROTECT(2);
return(result);
}
SEXPの挨拶が引数として渡され、作成者がすぐにそれを保護しました。しかし、Writing R Extensionsから私はこのビットに気づいた:
Rは既に使用されているとわかっているオブジェクトには必要ありません。特に、これは関数の引数に適用されます。
したがって、作成者が渡された引数を保護するこれらのコード例がトリミングされる可能性があるかどうかを誰かに教えてもらえますか?この場合、私は自分のコードをもっときれいにすることができます。
あなたは関数の引数を 'PROTECT 'する必要はないという前提で、(正しい)(http://adv-r.had.co.nz/C-interface.html)です。 – hrbrmstr
@hrbrmstr投稿が回答になる前に[r-faq]タグを追加する理由は何ですか? –
[こちら](http://adv-r.had.co.nz/C-interface.html#c-vectors)の件名にもう少し詳しい情報があります。 – nrussell