我有一堆Rcpp代码,我必须重写为一个无Rcpp的C/C++扩展(由于它的许可证),幸运的是它并没有像我担心的那样痛苦.但为了编写最干净的代码,我想确保我不会过度使用PROTECT/UNPROTECT.在写作R附加文档提到:"这不是一个好主意,然后只在PROTECT眼前的一切......"所以我想是尽职尽责的.
所以这是我想检查的事情.在阅读为R编写C扩展的所有示例时,我已经看到许多示例,其中作者保护传递函数的参数,如本文所述.
#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);
}
Run Code Online (Sandbox Code Playgroud)
SEXP问候作为一个论点传入,作者立即保护它.但是,从Writing R Extensions中我注意到了这一点:
对于R已经知道正在使用的对象,不需要保护.特别是,这适用于函数参数.
因此,为了进行健全性检查,有人可以告诉我,作者保护传入参数的代码示例是否可以减少?如果是这种情况,我将能够使我的代码更清洁.