[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