2012-12-26 13 views
62

Żadna z nich pokazać kod źródłowy pnorm funkcjiJak wyświetlić kod źródłowy funkcji R .Internal lub .Primitive?

stats:::pnorm 
getAnywhere(pnorm) 

Jak mogę zobaczyć kod źródłowy pnorm?

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

oraz, w jaki sposób mogę zobaczyć kod źródłowy funkcji sum?

Odpowiedz

74

Kod źródłowy R pnorm jest:

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

Tak, technicznie rzecz biorąc, wpisując "pnorm" robi pokazać kod źródłowy. Jednak bardziej użytecznie: Flaki pnorm są kodowane w C, więc porady z poprzedniego pytania view source code in R są tylko przydatne peryferyjnie (większość koncentruje się na funkcjach ukrytych w przestrzeniach nazw itp.).

Uwe Ligges's article in R news (str. 43) to dobre ogólne odniesienie. Od tego dokumentu:

Patrząc na kod źródłowy R, czasami nazywa do jednej z następujących funkcji pojawiają się: .C(), .Połączenia(), .Fortran(), .External() lub .Internal() i .Primitive(). Te funkcje wywołują punkty wejścia w skompilowanym kodzie, takim jak obiekty wspólne, biblioteki statyczne lub biblioteki dołączane dynamicznie. Dlatego też, należy zajrzeć do źródeł skompilowanego kodu, jeśli wymagane jest pełne zrozumienie kodu: . ... Pierwszym krokiem jest przyjrzenie się punkt wejścia w pliku '$ R HOME/src/main/names.c', jeśli funkcja powołanie R to .Primitive() lub .Internal() . Wykonano to w poniższym przykładzie dla kodu implementującego funkcję "prostą" R sum().

(podkreślenie dodane ponieważ dokładna funkcja pytasz o (sum) jest ujęta w art Ligges Użytkownika).

W zależności od tego, jak poważnie chcesz kopać w kodzie, może warto pobierania i rozpakowywanie kodu źródłowego, jak sugeruje Ligges (na przykład, możesz użyć narzędzi wiersza poleceń, takich jak , takich jak grep, aby przeszukać kod źródłowy). Aby uzyskać bardziej swobodny przegląd, można zobaczyć źródeł online za pośrednictwem R Subversion server lub Winston Chang's github mirror (linki tutaj są specjalnie do src/nmath/pnorm.c). (Odgadywanie odpowiednie miejsce, aby spojrzeć, src/nmath/pnorm.c, wymaga pewnej znajomości struktury kodu źródłowego R).

mean i sum są realizowane zarówno w summary.c.

+1

jest w innej kategorii niż 'pnorm'. Wypróbuj 'mean.default' dla kodu R i https://github.com/wch/r-source/blob/trunk/src/main/summary.c dla kodu C. I przeczytaj przeczytany artykuł Uwe Ligges! –

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

To wydaje się nie odpowiadać na oryginalne pytanie OP (o 'pnorm'), ale ich komentarz poniżej o" mean "- i zauważ, że to również przechodzi na kod C, na dole (zobacz mój komentarz poniżej). –

+1

Rzeczywiście. A "poprawna odpowiedź" to ta, którą dałeś wcześniej ... przeczytaj artykuł Uwe Ligges w RNews. –

23

Wiem, że ten post ma ponad 2 lata, ale pomyślałem, że może to być przydatne dla niektórych użytkowników przeglądających to pytanie.

Po prostu kopiuję swoją odpowiedź na this other similar question, dzięki czemu może okazać się przydatna dla niektórych użytkowników R, którzy chcą eksplorować pliki źródłowe C.

  1. Po pierwsze, z pryr można używać funkcji show_c_source która wyszukiwania na GitHub odpowiedni kawałek kodu w plikach źródłowych C. Działa dla .Internal i .Primitive funkcji.

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

    który zabierze cię do this page, pokazując, że unique.c zawiera funkcję do_matchcall.

  2. I już ułożyła tej tab delimited file, opierając się na pliku names.c i korzystania znaleźć w swojej plików aby określić położenie kodu źródłowego. Istnieją pewne funkcje, które mają pliki specyficzne dla platformy i garść innych, dla których istnieje więcej niż jeden plik z odpowiednim kodem źródłowym. Ale dla reszty mapowanie jest dość dobrze ustalone, przynajmniej dla obecnej wersji (3.1.2).

Powiązane problemy