2012-12-26 16 views
62

इनमें से न तो pnorm समारोह के स्रोत कोड दिखाने के लिए,आर। आंतरिक स्रोत या स्रोत के स्रोत कोड को कैसे देखें?

stats:::pnorm 
getAnywhere(pnorm) 

कैसे मैं pnorm के स्रोत कोड देख सकते हैं?

sum 
(..., na.rm = FALSE) .Primitive("sum") 
.Primitive("sum") 
function (..., na.rm = FALSE) .Primitive("sum") 
methods(sum) 
no methods were found 

और, मैं sum फ़ंक्शन का स्रोत कोड कैसे देख सकता हूं?

उत्तर

74

pnorm के आर स्रोत कोड है:

function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) 
.Call(C_pnorm, q, mean, sd, lower.tail, log.p) 

तो, तकनीकी तौर पर, "pnorm" टाइप करता आप स्रोत कोड को दिखाते हैं। हालांकि, अधिक उपयोगी रूप से: pnorm की गड़बड़ी सी में कोडित की गई है, इसलिए पिछले प्रश्न view source code in R में सलाह केवल परिधीय रूप से उपयोगी है (इसमें से अधिकांश नामस्थानों में छिपे हुए कार्यों पर ध्यान केंद्रित करती हैं)।

उवे लिगेज का article in R news (पृष्ठ 43) एक अच्छा सामान्य संदर्भ है। उस दस्तावेज़ से:

जब आर स्रोत कोड देख, कभी कभी कॉल निम्नलिखित कार्यों में से एक के लिए दिखाई देते हैं: सी(), .Call(), .Fortran(), .External(), या आंतरिक() और .Primitive()। ये फ़ंक्शंस संकलित कोड जैसे कि साझा ऑब्जेक्ट्स, स्थिर पुस्तकालय या गतिशील लिंक लाइब्रेरीज़ में प्रवेश बिंदुओं को कॉल कर रहे हैं। इसलिए, कोड की पूरी समझ आवश्यक है, तो संकलित कोड के स्रोतों को देखना आवश्यक है। ... पहला चरण फ़ाइल '$ R HOME/src/main/names.c' में प्रविष्टि बिंदु को देखना है, यदि कॉलिंग आर फ़ंक्शन या तो है .प्रिमेटिव() या । आंतरिक() । यह 'सरल' आर फ़ंक्शन योग() लागू करने वाले कोड के लिए निम्न उदाहरण में किया गया है।

(जोर जोड़ा क्योंकि सटीक समारोह आप के बारे में पूछा (sum) Ligges के लेख में कवर किया जाता है।)

कैसे गंभीरता से आप कोड में खुदाई करने के लिए चाहते हैं पर निर्भर करता है, यह डाउनलोड करने लायक और हो सकता है स्रोत कोड को अनपॅक करने के रूप में Ligges सुझाता है (उदाहरण के लिए, आप स्रोत कोड के माध्यम से कमांड लाइन उपकरण जैसे grep का उपयोग कर सकते हैं)। अधिक आकस्मिक निरीक्षण के लिए, आप आर Subversion server या Winston Chang's github mirror के माध्यम से ऑनलाइन स्रोत देख सकते हैं (यहां लिंक विशेष रूप से src/nmath/pnorm.c पर हैं)। (सही जगह देखने के लिए, src/nmath/pnorm.c भाँप रहे, आर स्रोत कोड की संरचना के साथ कुछ परिचित लगते हैं।)

mean और sum दोनों summary.c में लागू कर रहे हैं।

+1

यह 'pnorm' से एक अलग श्रेणी में है। आर कोड के लिए 'mean.default' आज़माएं, और सी कोड के लिए https://github.com/wch/r-source/blob/trunk/src/main/summary.c आज़माएं। और उपरोक्त लिंक यूवे लिगेज के लेख को पढ़ें! –

6
> methods(mean) 
[1] mean.data.frame mean.Date  mean.default mean.difftime mean.IDate*  
[6] mean.POSIXct mean.POSIXlt mean.yearmon* mean.yearqtr* 

    Non-visible functions are asterisked 
> mean.default 
function (x, trim = 0, na.rm = FALSE, ...) 
{ 
    if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) { 
     warning("argument is not numeric or logical: returning NA") 
     return(NA_real_) 
    } 
    if (na.rm) 
     x <- x[!is.na(x)] 
    if (!is.numeric(trim) || length(trim) != 1L) 
     stop("'trim' must be numeric of length one") 
    n <- length(x) 
    if (trim > 0 && n) { 
     if (is.complex(x)) 
      stop("trimmed means are not defined for complex data") 
     if (any(is.na(x))) 
      return(NA_real_) 
     if (trim >= 0.5) 
      return(stats::median(x, na.rm = FALSE)) 
     lo <- floor(n * trim) + 1 
     hi <- n + 1 - lo 
     x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] 
    } 
    .Internal(mean(x)) 
} 
<bytecode: 0x155ef58> 
<environment: namespace:base> 
+0

ऐसा लगता है कि ओपी के मूल प्रश्न (लगभग 'pnorm') का जवाब नहीं देना है, लेकिन नीचे उनकी टिप्पणी' माध्य 'के बारे में है - और ध्यान दें कि यह सी कोड में भी नीचे आता है, नीचे (नीचे मेरी टिप्पणी देखें)। वास्तव में –

+1

। और "सही उत्तर" वह है जिसे आपने पहले दिया था ... RNews में यूवे लिगेज का लेख पढ़ें। –

23

मुझे पता है कि यह पोस्ट 2 साल पुराना है, लेकिन मैंने सोचा कि यह इस प्रश्न के माध्यम से ब्राउज़ करने वाले कुछ उपयोगकर्ताओं के लिए उपयोगी हो सकता है।

मैं मूल रूप से केवल this other similar question पर अपना उत्तर कॉपी कर रहा हूं ताकि यह कुछ आर उपयोगकर्ताओं को उपयोगी साबित हो सके जो सी स्रोत फ़ाइलों का पता लगाना चाहते हैं।

  1. पहले, pryr साथ आप का उपयोग show_c_source समारोह जो GitHub पर सी स्रोत फ़ाइलों में कोड के प्रासंगिक टुकड़ा खोज करेंगे कर सकते हैं। आंतरिक और व्यावहारिक कार्यों के लिए काम करता है।

    body(match.call) 
    
    # .Internal(match.call(definition, call, expand.dots)) 
    
    pryr::show_c_source(.Internal(match.call(definition, call, expand.dots))) 
    

    जो तुम this page पर ले जाता है, दिखा रहा है कि unique.c समारोह do_matchcall शामिल हैं।

  2. मैं एक साथ इस tab delimited file रख दिया है, names.c फ़ाइल पर निर्माण और का उपयोग कर में फ़ाइलों स्रोत कोड के स्थान का निर्धारण करने के लिए। ऐसे कुछ फ़ंक्शन हैं जिनमें प्लेटफ़ॉर्म-विशिष्ट फ़ाइलें हैं, और कुछ अन्य हैं जिनके लिए प्रासंगिक स्रोत कोड के साथ एक से अधिक फ़ाइल हैं। लेकिन बाकी के लिए मैपिंग कम से कम वर्तमान संस्करण (3.1.2) के लिए बहुत अच्छी तरह से स्थापित है।

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