2013-12-18 2 views
9

मैं सीखना चाहता हूं कि कैसे optim(..., hessian=TRUE) एक हेसियन की गणना करता है, इसलिए मैंने फ़ंक्शन की परिभाषा पर एक नज़र डाली। अपने अंत के पास, यह .External2() को यह कॉल में शामिल हैं:.xternal2() द्वारा कोडित कोड का पता कैसे लगाएं?

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

ऐसा लगता है कि C_optimhess नामित एक बाहरी सी फ़ंक्शन की कॉल है जैसे, इसलिए मैं C_optimhess के लिए R स्रोत निर्देशिका d grep, लेकिन आया emptyhanded। आर के कोड बेस में उस स्ट्रिंग की केवल दो घटनाएं हैं, optim में से एक और optimHess में से एक है। दोनों कार्यों को $R_SOURCE_DIR/src/library/stats/R/optim.R में परिभाषित किया गया है, और उस फ़ाइल में कोई अतिरिक्त संकेत/टिप्पणियां/संदर्भ शामिल नहीं हैं।

optim की सहायता फ़ाइल संदर्भ कोड जिस पर फ़ंक्शन की ऑप्टिमाइज़ेशन विधियों पर आधारित थे, लेकिन C_optimhess के स्रोत को इंगित नहीं करते हैं (ऐसा लगता है)।

इस तरह के मामले में, मुझे .External2 द्वारा सी कोड कहां से जाना चाहिए?

उत्तर

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" 

तो तुम $R_SOURCE_DIR/src/library/stats/src/ में "optimhess के लिए" grep की जरूरत है:

[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

महान है, धन्यवाद! (इसके बारे में एक पंक्ति या दो "इस प्रश्न के आपके व्यापक रूप से व्यापक उत्तर के" संकलित कोड कॉल किए गए कार्यों "अनुभाग में एक अच्छा जोड़ा हो सकता है (http://stackoverflow.com/questions/19226816/how-can-i -व्यू-द-सोर्स-कोड-फॉर-ए-फ़ंक्शन/1 9 226817 # 1 9 226817)।) –

+1

@ जोशो'ब्रायन: किया गया; और यह अंततः समुदाय विकी है, क्योंकि यह शुरुआत से ही होना चाहिए था (लेकिन मुझे इसे सीडब्ल्यू के रूप में चिह्नित करने की अनुमति नहीं थी)। –

संबंधित मुद्दे