I wonder if anyone can illustrate to me how R executes a C
call from an R command typed at the console prompt. I am particularly confused by R
's treatment of a) function arguments and b) the function call itself.
Let's take an example, in this case set.seed()
. Wondering how it works I type the name in at the prompt, get the source (look here for more on that), see there is eventually a .Internal(set.seed(seed, i.knd, normal.kind)
, so dutifully look up the relevant function name in the .Internals
section of /src/names.c
, find it is called do_setseed
and is in RNG.c
which leads me to...
SEXP attribute_hidden do_setseed (SEXP call, SEXP op, SEXP args, SEXP env)
{
SEXP skind, nkind;
int seed;
checkArity(op, args);
if(!isNull(CAR(args))) {
seed = asInteger(CAR(args));
if (seed == NA_INTEGER)
error(_("supplied seed is not a valid integer"));
} else seed = TimeToSeed();
skind = CADR(args);
nkind = CADDR(args);
//...
//DO RNG here
//...
return R_NilValue;
}
- What are
CAR
,CADR
,CADDR
? My research leads me to believe they are aLisp
influenced construct concerning lists but beyond that I do not understand what these functions do or why they are needed. - What does
checkArity()
do? SEXP args
seems self explanatory, but is this a list of the arguments that is passed in the function call?- What does
SEXP op
represent? I take this to mean operator (like in binary functions such as+
), but then what is theSEXP call
for?
Is anyone able to flow through what happens when I type
set.seed(1)
at the R console prompt, up to the point at which skind
and nkind
are defined? I find I am not able to well understand the source code at this level and path from interpreter to C function.