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; }
Tierney, Luke
2019-Nov-01 12:26 UTC
[Rd] [External] R C api for 'inherits' S3 and S4 objects
On Fri, 1 Nov 2019, Jan Gorecki wrote:> 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 unfortunatelyYour premise is not correct. Rf_inherits will not GC but it can allocate and is not thread safe. Best, luke> 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; > } > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
Jan Gorecki
2019-Nov-01 13:23 UTC
[Rd] [External] R C api for 'inherits' S3 and S4 objects
Thank you Luke. That is why I don't use Rf_inherits but INHERITS which does not allocate, provided in the email body. I cannot do similarly for S4 classes, thus asking for some API for that. On Fri, Nov 1, 2019 at 5:56 PM Tierney, Luke <luke-tierney at uiowa.edu> wrote:> > On Fri, 1 Nov 2019, Jan Gorecki wrote: > > > 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 > > Your premise is not correct. Rf_inherits will not GC but it can > allocate and is not thread safe. > > Best, > > luke > > > 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; > > } > > > > ______________________________________________ > > R-devel at r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > -- > Luke Tierney > Ralph E. Wareham Professor of Mathematical Sciences > University of Iowa Phone: 319-335-3386 > Department of Statistics and Fax: 319-335-3017 > Actuarial Science > 241 Schaeffer Hall email: luke-tierney at uiowa.edu > Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
If your goal is to perform multithreaded computations, why not perform all necessary interactions with R upfront and then compute only on primitives? It would help for us to understand your use case. On Fri, Nov 1, 2019 at 4:26 AM Jan Gorecki <j.gorecki at wit.edu.pl> wrote:> > 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; > } > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel-- Michael Lawrence Senior Scientist, Bioinformatics and Computational Biology Genentech, A Member of the Roche Group Office +1 (650) 225-7760 michafla at gene.com Join Genentech on LinkedIn | Twitter | Facebook | Instagram | YouTube