2013-12-18 34 views
9

optim(..., hessian=TRUE)'un Hessian'ı nasıl hesapladığını öğrenmek istiyorum, bu yüzden işlevin tanımına bir göz attım. sonuna yakın otelde .External2() bu çağrıyı içerir: C_optimhess adında bir harici C işlevine bir çağrı var gibi.External2() tarafından çağrılan kod nasıl bulunur?

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

görünüyor, bu yüzden 'C_optimhess R kaynak dizini d grep ama geldi emptyhanded. R'nin kod tabanında, optim'dan birinde ve optimHess'dan birinde bu dizenin yalnızca iki tekrarı vardır. Her iki işlev de $R_SOURCE_DIR/src/library/stats/R/optim.R'da tanımlanmıştır ve bu dosyada ek ipucu/yorum/referans bulunmamaktadır.

optim Yardım dosyası, işlevin en iyi duruma getirme yöntemlerinin birkaçının temel aldığı, ancak C_optimhess kaynağına işaret etmediği kodları referans alır.

Böyle bir durumda, .External2 tarafından çağrılan C kodunu nerede bulabilirim?

cevap

12

C_optimhess'un bir nesne değil, bir dize olduğuna dikkat edin.

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

Yani $R_SOURCE_DIR/src/library/stats/src/ yılında "optimhess" için yazılması gerekir:

[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

Harika, teşekkürler! (Bununla ilgili bir çizgi veya iki [bu soruya gittikçe artan kapsamlı cevabınızın] "derlenmiş kodu çağıran işlevler" bölümüne hoş bir ekleme yapabilir (http://stackoverflow.com/questions/19226816/how-can-i -görüntü-için-kaynak-kod-için-işlev/19226817 # 19226817).) –

+1

@ JoshO'Brien: done; ve sonuçta en başından beri olması gerektiği gibi topluluk wiki'sidir (ancak bunu CW olarak işaretlemem). –

İlgili konular