小编Mur*_*ams的帖子

是否有必要保护.Call参数?

我有一堆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已经知道正在使用的对象,不需要保护.特别是,这适用于函数参数.

因此,为了进行健全性检查,有人可以告诉我,作者保护传入参数的代码示例是否可以减少?如果是这种情况,我将能够使我的代码更清洁.

c r

2
推荐指数
2
解决办法
289
查看次数

标签 统计

c ×1

r ×1