ソースを探す

たとえば:

uniroot

とすると
その関数の中身が出て、その中で

val <- .Internal(zeroin2(function(arg) f(arg, ...), lower, 
        upper, f.lower, f.upper, tol, as.integer(maxiter)))

となっていて、

.Internal(zeroin2(....))

が作業の本体とわかりました。


さて、.Internal()関数ですが、
これは、ryamada本356ページにあるように
Rの内部関数です。
そこの記載に従って、
Rをソースコード付きでダウンロード(CRAN の Source Code for all Platformsから)して、

R/src/main/names.c
というファイルを開くと

{"zeroin2",	do_zeroin2,	0,	11,	7,	{PP_FUNCALL, 
PREC_FN,	0}},

という行があって、
Rの中では
"do_zeroin2"
という処理がC言語でなされていることがわかります。


このdo_zeroin2 の中身を知りたいのですが、
なかなか見つかりません。

結局、グーグル検索をすることによって、

R/src/main/optimize.c

の中に

/* zeroin2(f, ax, bx, f.ax, f.bx, tol, maxiter) */
SEXP attribute_hidden do_zeroin2(SEXP call, SEXP op, SEXP args, SEXP 
rho)
{
    double f_ax, f_bx;
    DO_ZEROIN_part_1;

    /* f(ax) = f(xmin) */
    f_ax = asReal(CAR(args));
    if (ISNA(f_ax))
	error(_("NA value for '%s' is not allowed"), "f.lower");
    args = CDR(args);

    /* f(bx) = f(xmax) */
    f_bx = asReal(CAR(args));
    if (ISNA(f_bx))
	error(_("NA value for '%s' is not allowed"), "f.upper");
    args = CDR(args);

    DO_ZEROIN_part_2;

    REAL(res)[0] =
	R_zeroin2(xmin, xmax, f_ax, f_bx, (double (*)(double, void*)) 
fcn2,
		 (void *) &info, &tol, &iter);
    REAL(res)[1] = (double)iter;
    REAL(res)[2] = tol;
    UNPROTECT(2);
    return res;
}

を見つけ、

R_zeroin2()
関数を見つけないといけないことがわかりました。

さらに、
R_zeroin2()
をグーグル検索して、
それが

R/src/appl/zeroin.c

に書かれていることにたどり着きました。

さて、この検索をどうやって、効率よくしたらよいだろうか。

こんなのも
http://www.fireproject.jp/feature/gdb/omake/cflow.html 
http://miau.s9.xrea.com/blog/?itemid=52 
あるらしい。