Saltar al contenido

¿Cómo ver el código fuente de la función R .Internal o .Primitive?

Esta es la respuesta más exacta que te podemos dar, pero primero estúdiala detenidamente y valora si se puede adaptar a tu trabajo.

Solución:

El código fuente R de pnorm es:

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

Entonces, técnicamente hablando, escribir “pnorm” hace mostrarle el código fuente. Sin embargo, más útil: las tripas de pnorm están codificados en C, por lo que el consejo de la pregunta anterior ver el código fuente en R solo es útil de forma periférica (la mayor parte se concentra en funciones ocultas en espacios de nombres, etc.).

El artículo de Uwe Ligges en R news (p. 43) es una buena referencia general. De ese documento:

Al mirar el código fuente de R, a veces aparecen llamadas a una de las siguientes funciones: .C(), .Call(), .Fortran(), .External() o .Internal() y .Primitive(). Estas funciones llaman a puntos de entrada en código compilado, como objetos compartidos,
static bibliotecas o bibliotecas de enlaces dinámicos. Por lo tanto, es necesario investigar las fuentes del código compilado, si se requiere una comprensión completa del código. … El primer paso es buscar el punto de entrada en el archivo ‘$R HOME/src/main/names.c’, si la función R que llama es .Primitive() o .Internal(). Esto se hace en el siguiente ejemplo para el código que implementa la función R ‘simple’ sum().

(Énfasis agregado porque la función precisa sobre la que preguntó (sum) está cubierto en el artículo de Ligges.)

Dependiendo de la seriedad con la que desee profundizar en el código, puede valer la pena descargar y descomprimir el código fuente como sugiere Ligges (por ejemplo, puede usar herramientas de línea de comandos como grep para buscar a través del código fuente). Para una inspección más informal, puede ver las fuentes en línea a través del servidor R Subversion o el espejo github de Winston Chang (los enlaces aquí son específicamente para src/nmath/pnorm.c). (Adivinar el lugar correcto para buscar, src/nmath/pnorm.cse familiariza un poco con la estructura del código fuente de R).

mean y sum ambos se implementan en resumen.c.

Sé que esta publicación tiene más de 2 años, pero pensé que esto podría ser útil para algunos usuarios que navegan por esta pregunta.

Básicamente, solo estoy copiando mi respuesta a esta otra pregunta similar para que pueda resultar útil para algunos usuarios de R que desean explorar los archivos fuente de C.

  1. Primero, con palanca puedes usar el show_c_source función que buscará en GitHub la pieza de código relevante en los archivos fuente de C. Funciona para funciones .Internal y .Primitive.

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

    Lo que te lleva a esta página, mostrando que unique.c contiene la función do_matchcall.

  2. He reunido este archivo delimitado por tabuladores, basado en el names.c archivo y uso buscar en archivos para determinar la ubicación del código fuente. Hay algunas funciones que tienen archivos específicos de la plataforma y algunas otras para las que hay más de un archivo con código fuente relevante. Pero por lo demás, el mapeo está bastante bien establecido, al menos para la versión actual (3.1.2).

> 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, ...) 
 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))



Si te ha resultado de provecho nuestro artículo, sería de mucha ayuda si lo compartieras con el resto programadores y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *