consplan r语言_R语言经典问答:深入理解.Internal函数

本文通过R语言的set.seed()函数源代码,探讨了R语言中.Internal函数的工作原理,以及R语言受Lisp影响的体现,如CAR和CDR操作。通过对set.seed()的分析,揭示了.R函数参数处理的机制,并介绍了.R函数如何检查参数个数、调用环境以及.Lisp中的pairlist数据结构在R中的应用。
摘要由CSDN通过智能技术生成

写R语言的书,很多都会提到一个历史话题,就是“Scheme和R语言的关系”。也有很多人问过我,R究竟哪里受了Scheme或者Lisp影响。这个提问也正好提供了一个很好的例子。

“黑魔法”

今天咱们从set.seed()函数的源代码(如下所示)聊起。

可以明显看到提前定义的宏(checkArity、CADR、CADDR等)和函数的四个参数(call、op、args和env),当真正使用的时候,set.seed()貌似只有一个参数,比如set.seed(1)。

那这些“黑魔法”究竟是做什么的。

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);

GetRNGkind(R_NilValue); /* pull RNG_kind, N01_kind from

.Random.seed if present */

if (!isNull(skind)) RNGkind((RNGtype) asInteger(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值