Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to locate code called by .External2()?

Tags:

r

I would like to learn how optim(..., hessian=TRUE) computes a Hessian, so I took a look at the function's definition. Near its end, it includes this call to .External2():

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

Looks like there's a call to an external C function named C_optimhess, so I grep'd the R source directory for C_optimhess, but came up emptyhanded. There are only two occurrences of that string in R's code base, one in optim and one in optimHess. Both functions are defined in $R_SOURCE_DIR/src/library/stats/R/optim.R, and that file includes no additional hints/comments/references.

optim's help file references code on which several of the function's optimization methods were based, but doesn't (seem to) point to the source of C_optimhess.

In a case like this, where should I look to find the C code being called by .External2?

like image 535
Josh O'Brien Avatar asked Dec 18 '13 18:12

Josh O'Brien


1 Answers

Notice that C_optimhess is an object, not a string.

> 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"

So you need to grep for "optimhess" in $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);
like image 137
Joshua Ulrich Avatar answered Oct 10 '22 11:10

Joshua Ulrich