[Rd] SET_TYPEOF no longer allowed, how should I call R from within C?
Tomas Kalibera
tom@@@k@||ber@ @end|ng |rom gm@||@com
Tue Jun 25 14:35:38 CEST 2024
On 6/25/24 11:25, Matthew Fidler wrote:
> Hi,
>
> I have adapted code to run R from within C from the writing R extensions
> here
>
> https://colinfay.me/writing-r-extensions/system-and-foreign-language-interfaces.html
>
> As a more comprehensive example of constructing an R call in C code and
> evaluating, consider the following fragment of printAttributes in
> src/main/print.c.
>
> /* Need to construct a call to
>
> print(CAR(a), digits=digits)
>
> based on the R_print structure, then eval(call, env).
>
> See do_docall for the template for this sort of thing.
>
> */
>
> SEXP s, t;
>
> t = s = PROTECT(allocList(3));
>
> SET_TYPEOF(s, LANGSXP);
>
> SETCAR(t, install("print")); t = CDR(t);
>
> SETCAR(t, CAR(a)); t = CDR(t);
>
> SETCAR(t, ScalarInteger(digits));
>
> SET_TAG(t, install("digits"));
>
> eval(s, env);
>
> UNPROTECT(1);
>
> At this point CAR(a) is the R object to be printed, the current attribute.
> There are three steps: the call is constructed as a pairlist of length 3,
> the list is filled in, and the expression represented by the pairlist is
> evaluated.
>
> A pairlist is quite distinct from a generic vector list, the only
> user-visible form of list in R. A pairlist is a linked list (with CDR(t)
> computing the next entry), with items (accessed by CAR(t)) and names or
> tags (set by SET_TAG). In this call there are to be three items, a symbol
> (pointing to the function to be called) and two argument values, the first
> unnamed and the second named. Setting the type to LANGSXP makes this a call
> which can be evaluated.
>
>
>
> New checks tells me that this is no longer allowed since it was not part
> of the public api any longer.
>
>
> So, how does one call R from C then?
>
> Also should the writing R extensions be updated with the new approved
> approach?
Please check the current Writing R Extensions from the official
location. It has an updated version of the example using allocLang.
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Evaluating-R-expressions-from-C
https://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Evaluating-R-expressions-from-C
Best
Tomas
>
>
> Thanks in advance.
>
> Matt
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list