Where is the code for recycling `rbinom` inputs?

徘徊边缘 提交于 2020-01-25 04:05:27

问题


From the documentation, rbinom takes three arguments, n, size, and prob. The answer to this question states that if prob is a vector, it is recycled until n is reached. I want to find that code!

The R source immediately calls a C function:

> rbinom
function (n, size, prob) 
.Call(C_rbinom, n, size, prob)
<bytecode: 0x113526220>
<environment: namespace:stats>

Searching the Github mirror for R gets me the this rbinom C function, but it only takes two arguments. Where is n? Where is the recycling of prob to the length of n? I can't find it in this function definition.

double rbinom(double nin, double pp)
{
...
}

Searching for all C files containing rbinom, the only other relevant-seeming C file I found is this one, but I don't understand it. Is this where the recycling happens, or is there another function definition somewhere that I am missing?


回答1:


With the helpful guidance of stack overflow I managed to answer this to my satisfaction. I'm not sure about the details, but here goes:

> rbinom

calls this line

rbinom <- function(n, size, prob) .Call(C_rbinom, n, size, prob)

located at line 149 of /src/library/stats/R/distn.R

This in turn is going to call

static R_INLINE SEXP random2(SEXP sn, SEXP sa, SEXP sb, ran2 fn, SEXPTYPE type)

with sn=n, sa=size, sb=prob and fn=rbinom.

In that function the code you want is on ine 185: rx = fn(ra[i % na], rb[i % nb]); which shows that rbinom is called recycling both the size and prob parameter.

The connection between random2 and rbinom is established with a preprocessor in the same file as the function random2.

DEFRAND2_INT(rbinom)
#define DEFRAND2_INT(name) \
    SEXP do_##name(SEXP sn, SEXP sa, SEXP sb) { \
        return random2(sn, sa, sb, name, INTSXP); \
    }


来源:https://stackoverflow.com/questions/55462254/where-is-the-code-for-recycling-rbinom-inputs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!