Интересно, может ли кто-нибудь показать мне, как R выполняет вызов C
из команды R, введенной в командной строке. Меня особенно смущает R
обработка аргументов функции) и б) сам вызов функции.
Пусть возьмем пример, в данном случае set.seed()
. Удивительно, как это работает. Я ввожу имя в приглашении, получаю источник ( здесь, чтобы узнать больше об этом), см., В конце концов, a .Internal(set.seed(seed, i.knd, normal.kind)
, так послушно найдите соответствующее имя функции в разделе .Internals
/src/names.c
, найдите, что он называется do_setseed
и находится в RNG.c
, что приводит меня к...
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;
}
- Что такое
CAR
,CADR
,CADDR
? Мои исследования заставляют меня думать, что они являются конструкцией, влияющей наLisp
, касающейся списков, но помимо этого я не понимаю, что делают эти функции или почему они необходимы. - Что делает
checkArity()
? -
SEXP args
кажется самоочевидным, но это список аргументы, которые передаются в вызове функции? - Что представляет
SEXP op
? Я считаю, что это означает оператор (например, в двоичных функциях, таких как+
), но тогда что такоеSEXP call
для?
Кто-нибудь может протекать через то, что происходит, когда я печатаю
set.seed(1)
в командной строке R, до точки, в которой определены skind
и nkind
? Я нахожу, что не могу понять исходный код на этом уровне и путь от интерпретатора до функции C.