Интересно, может ли кто-нибудь показать мне, как 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.