[Rd] R C api for 'inherits' S3 and S4 objects

Jan Gorecki j@goreck| @end|ng |rom w|t@edu@p|
Fri Nov 1 12:26:00 CET 2019


Dear R developers,

Motivated by discussion about checking inheritance of S3 and S4
objects (in head matrix/array topic) I would light to shed some light
on a minor gap about that matter in R C API.
Currently we are able to check inheritance for S3 class objects from C
in a robust way (no allocation, thread safe). This is unfortunately
not possible for S4 classes. I would kindly request new function in R
C api so it can be achieved for S4 classes with no risk of allocation.
For reference mentioned functions below. Thank you.
Jan Gorecki

// S3 inheritance
bool INHERITS(SEXP x, SEXP char_) {
  SEXP klass;
  if (isString(klass = getAttrib(x, R_ClassSymbol))) {
    for (int i=0; i<LENGTH(klass); i++) {
      if (STRING_ELT(klass, i) == char_) return true;
    }
  }
  return false;
}
// S4 inheritance
bool Rinherits(SEXP x, SEXP char_) {
  SEXP vec = PROTECT(ScalarString(char_));
  SEXP call = PROTECT(lang3(sym_inherits, x, vec));
  bool ans = LOGICAL(eval(call, R_GlobalEnv))[0]==1;
  UNPROTECT(2);
  return ans;
}



More information about the R-devel mailing list