中处理我不知道是否有人可以向我说明R如何通过在控制台提示符下键入的R命令执行C
调用。我特别困惑于R
对a)函数参数的处理和b)函数调用本身。了解如何。内部的C函数在R
我们举一个例子,在这种情况下为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
?
是任何人都能够通过,当我在R控制台提示符下键入
set.seed(1)
,高达skind
和nkind
被定义在这点会发生什么流?我发现我无法很好地理解这个级别的源代码以及从解释器到C函数的路径。
您可能想从http://adv-r.had.co.nz/C-interface.html开始 - 我将在稍后为此特定示例撰写一些更多详细信息。 – hadley
@hadley谢谢,我今晚会经历这个。我真的很期待你的书被释放!很快,我希望。 :-) –
@ SimonO101:我会在你的问题标题 –