Где код для переработки `rbinom` входов? - PullRequest
1 голос
/ 01 апреля 2019

Из документации rbinom принимает три аргумента, n, size и prob. Ответ на на этот вопрос гласит, что если prob является вектором, то он используется повторно до тех пор, пока не будет достигнут n. Я хочу найти этот код!

Источник R немедленно вызывает функцию C:

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

Поиск в зеркале Github для R дает мне эту rbinom C функцию , но она принимает только два аргумента. Где n? Где переработка prob на длину n? Я не могу найти его в этом определении функции.

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

Поиск всех файлов C, содержащих rbinom, единственный другой соответствующий C файл, который я нашел , это , но я его не понимаю. Это где происходит переработка или есть другое определение функции где-то, что мне не хватает?

1 Ответ

0 голосов
/ 02 апреля 2019

С помощью полезного руководства по переполнению стека мне удалось ответить на это к моему удовлетворению.Я не уверен в деталях, но здесь идет:

> rbinom

вызывает эту линию

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

, расположенную в строке 149из /src/library/stats/R/distn.R

Это, в свою очередь, вызовет

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

с sn=n, sa=size, sb=prob и fn=rbinom.

В этой функции вы хотите получить код, равный 185: rx = fn(ra[i % na], rb[i % nb]);, который показывает, что rbinom называется утилизацией как параметра size, так и параметра prob.

Соединение между random2 и rbinom устанавливается с помощьюпрепроцессор в том же файле, что и функция random2.

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