【发布时间】:2013-11-08 22:21:38
【问题描述】:
我想知道是否有人可以向我说明 R 如何从在控制台提示符下键入的 R 命令执行 C 调用。我对R 对 a) 函数参数和 b) 函数调用本身的处理感到特别困惑。
让我们举个例子,在这种情况下set.seed()。想知道它是如何工作的,我在提示符下输入名称,获取源(look here for more on that),看到最终有一个.Internal(set.seed(seed, i.knd, normal.kind),所以尽职尽责地在/src/names.c 的.Internals 部分查找相关函数名称,发现它被称为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 函数的路径。
【问题讨论】:
-
您可能想从adv-r.had.co.nz/C-interface.html 开始 - 我很快就会为这个特定的例子写一些更多的细节。
-
@hadley 谢谢,今晚我会经历这个。我真的很期待你的书出版!很快,我希望。 :-)
-
@SimonO101:我会在你的问题标题中添加“... in R”
-
@OlivierDulac -- 完成,谢谢。对于仅使用
r标签标记的问题,我们通常对此不以为然,但由于这也出现在c标签下,我认为这是有道理的。