如何找到.External2()调用的代码?

时间:2013-12-18 18:17:35

标签: r

我想了解optim(..., hessian=TRUE)如何计算Hessian,所以我看了一下函数的定义。接近结束时,它包含对.External2()的调用:

if (hessian) 
    res$hessian <- .External2(C_optimhess, res$par, fn1, 
        gr1, con)

看起来有一个名为C_optimhess的外部C函数的调用,所以我grepC_optimhess的R源目录,但是空出来了。 R代码库中只出现两次该字符串,一个在optim中,一个在optimHess中。这两个函数都在$R_SOURCE_DIR/src/library/stats/R/optim.R中定义,该文件不包含其他提示/注释/引用。

optim的帮助文件引用了函数的几个优化方法所基于的代码,但没有(似乎)指向C_optimhess的来源。

在这种情况下,我应该在哪里找到.External2调用的C代码?

1 个答案:

答案 0 :(得分:12)

请注意C_optimhess是一个对象,而不是一个字符串。

> stats:::C_optimhess
$name
[1] "optimhess"

$address
<pointer: 0x266b1a0>
attr(,"class")
[1] "RegisteredNativeSymbol"

$dll
DLL name: stats
Filename: /usr/lib/R/library/stats/libs/stats.so
Dynamic lookup: FALSE

$numParameters
[1] 4

attr(,"class")
[1] "ExternalRoutine"  "NativeSymbolInfo"

所以你需要grep for&#34; optimhess&#34;在$R_SOURCE_DIR/src/library/stats/src/

josh@compy: $R_SOURCE_DIR/src/library/stats/src
> grep optimhess *
init.c:    EXTDEF(optimhess, 4),
optim.c:SEXP optimhess(SEXP call, SEXP op, SEXP args, SEXP rho)
statsR.h:SEXP optimhess(SEXP call, SEXP op, SEXP args, SEXP rho);