2013-12-18 12 views
9

Mi piacerebbe sapere come optim(..., hessian=TRUE) calcola un assia, quindi ho dato un'occhiata alla definizione della funzione. Vicino alla sua estremità, include questa chiamata a .External2():Come individuare il codice chiamato da .External2()?

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

Sembra che ci sia una chiamata a una funzione C esterna chiamata C_optimhess, così ho grep 'd la directory sorgente R per C_optimhess, ma si avvicinò a mani vuote. Ci sono solo due occorrenze di quella stringa nella base di codice di R, una in optim e una in optimHess. Entrambe le funzioni sono definite in $R_SOURCE_DIR/src/library/stats/R/optim.R e tale file non include ulteriori suggerimenti/commenti/riferimenti.

optim Il codice di riferimento del file di guida dell'aiuto su cui sono basati diversi metodi di ottimizzazione della funzione, ma che non sembra (indicare) l'origine di C_optimhess.

In un caso come questo, dove dovrei cercare di trovare il codice C chiamato da .External2?

risposta

12

Si noti che C_optimhess è un oggetto, non una stringa.

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

quindi è necessario grep per "optimhess" in $R_SOURCE_DIR/src/library/stats/src/:

[email protected]: $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); 
+0

Grande, grazie! (Una riga o due su questo potrebbe essere una bella aggiunta alla sezione "Funzioni che chiamano codice compilato" di [la tua risposta sempre più completa a questa domanda] (http://stackoverflow.com/questions/19226816/how-can-i -view-the-source-code-for-a-function/19226817 # 19226817).) –

+1

@ JoshO'Brien: fatto; ed è finalmente wiki della comunità, come avrebbe dovuto essere sin dall'inizio (ma non mi è stato permesso di contrassegnarlo come CW). –

Problemi correlati