ソースを探す
たとえば:
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
あるらしい。