R .Internal या .Primitive फ़ंक्शन का स्रोत कोड कैसे देखें?


81

इनमें से कोई भी 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फ़ंक्शन का स्रोत कोड कैसे देख सकता हूं ?

जवाबों:


96

आर स्रोत कोड 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सी में कोड किए गए हिम्मत हैं, इसलिए R में पिछले प्रश्न दृश्य स्रोत कोड में सलाह केवल परिधीय रूप से उपयोगी है (अधिकांश यह नामस्थानों में छिपे कार्यों पर केंद्रित है)।

आर न्यूज़ (पृष्ठ 43) में Uwe Ligges का लेख एक अच्छा सामान्य संदर्भ है। उस दस्तावेज़ से:

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

(जोर दिया क्योंकि सटीक फ़ंक्शन के बारे में आपने पूछा है sum) लिगेज के लेख में शामिल है।)

इस बात पर निर्भर करता है कि आप कोड में कितनी गंभीरता से खुदाई करना चाहते हैं, यह सोर्स कोड को डाउनलोड करने और अनपैक करने के लायक हो सकता है क्योंकि Ligges सुझाव देता है (उदाहरण के लिए, फिर आप कमांड-लाइन टूल का उपयोग कर सकते हैं जैसे grepकि सोर्स कोड के माध्यम से खोज करना)। अधिक आकस्मिक निरीक्षण के लिए, आप आर सबवर्सन सर्वर या विंस्टन चांग के जीथब मिरर के माध्यम से ऑनलाइन स्रोतों को देख सकते हैं (लिंक यहां विशेष रूप से हैं src/nmath/pnorm.c)। (देखने के लिए सही जगह का अनुमान लगाने src/nmath/pnorm.c, आर स्रोत कोड की संरचना के साथ कुछ परिचितता लेता है।)

meanऔर sumदोनों सारांश में लागू किए गए हैं ।


1
इससे अलग श्रेणी में है pnormmean.defaultआर कोड के लिए प्रयास करें , और सी कोड के लिए github.com/wch/r-source/blob/trunk/src/main/summary.c । और ऊपर लिंक Uwe Ligges का लेख पढ़ें!
बेन बोल्कर

1
बस इस उत्तर का पालन करें: सी या फोरट्रान में भी सटीक फ़ंक्शन नाम के बारे में सावधान रहने की आवश्यकता हो सकती है। उदाहरण: मैं उस स्रोत को देखने की कोशिश कर रहा था stl, जो इस लाइन को कहता है z <- .Fortran(C_stl, x, n, as.integer(period), as.integer(s.window):। इसलिए मैंने ऊपर दिए गए Github दर्पण को कीवर्ड द्वारा खोजा C_stlकोई फायदा नहीं हुआ। हालाँकि जब मैं खोज करता हूँ stlतो एक फाइल stl.fहोती है जिसे मैं ढूंढना चाहता हूं। टेकअवे एक .c या .f फ़ाइल नाम हो सकता है जो फ़ंक्शन नाम के समान नहीं है जिसे कहा जा रहा है।
युक्ली

35

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

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

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

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

    जो आपको इस पृष्ठ पर ले जाता है , unique.cजिसमें दिखाया जाता है कि फ़ंक्शन do_matchcall है

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


जब मैं C कोड खोजने की कोशिश करता हूं तो pryr काम नहीं करता है system: pryr::show_c_source(.Internal(system(x)))मुझे मिल गया हैError: Could not find entry for system
zhanxw

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

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

2
वास्तव में। और "सही उत्तर" वह है जो आपने पहले दिया था ... RNews में Uwe Ligges का लेख पढ़ें।
IRTFM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.