On 2024-06-25 5:25 a.m., 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
That was written in 2017. You should use the one that came with R, or
even better, the one that comes with the development version of R.
Duncan Murdoch
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?
Thanks in advance.
Matt
[[alternative HTML version deleted]]
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel