如何查看R .Internal或.Primitive函数的源代码?

这些都没有显示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函数的源代码?


pnorm的R源代码是:

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

所以,从技术上讲,输入“pnorm”会向您显示源代码。 然而,更有用的是: pnorm的内容用C编码,所以前面的问题视图R中的源代码的建议只是外围有用的(大部分集中于隐藏在命名空间中的函数等)。

Uwe Ligges在R新闻中的文章(第43页)是一个很好的一般参考。 从那个文件:

查看R源代码时,有时会调用以下函数之一:.C(),.Call(),.Fortran(),.External()或.Internal()和.Primitive()。 这些函数调用编译代码中的入口点,如共享对象,静态库或动态链接库。 因此,如果需要完整理解代码,就必须查看编译代码的来源。 ...如果调用的R函数是.Primitive()或.Internal(),则第一步是查找文件'$ R HOME / src / main / names.c'中的入口点。 这在下面的例子中为实现'simple'R函数sum()的代码完成。

(增加了重点,因为你问的关于( sum )的确切功能在Ligges的文章中有介绍。)

根据Ligges的建议(例如,然后可以使用命令行工具,例如grep来搜索源代码),可能需要下载和解压缩源代码,这取决于您想要深入研究代码。 对于更随意的检查,您可以通过R Subversion服务器或Winston Chang的github镜像在线查看源代码(这里的链接专门针对src/nmath/pnorm.c )。 ( src/nmath/pnorm.c正确的地方, src/nmath/pnorm.c ,需要熟悉R源代码的结构。)

meansum都在summary.c中实现。


我知道这篇文章是2岁多,但我认为这可能对浏览这个问题的一些用户有用。

我基本上只是将我的答案复制到这个其他类似的问题,以便它可以证明对于想要探索C源文件的R用户有用。

  • 首先,使用pryr,你可以使用show_c_source函数,它将在GitHub上搜索C源代码文件中的相关代码片段。 适用于.Internal和.Primitive功能。

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

    unique.c您带到此页面,显示unique.c包含函数do_matchcall。

  • 我已经将这个制表符分隔的文件放在一起,建立在names.c文件上,并使用find-in-files来确定源代码的位置。 有一些函数具有特定于平台的文件,还有一些函数具有多个具有相关源代码的文件。 但对于其余的映射来说,至少对于当前版本(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, ...) 
    {
        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>
    
    链接地址: http://www.djcxy.com/p/25035.html

    上一篇: How to see the source code of R .Internal or .Primitive function?

    下一篇: Modify R Graphics in CRAN Contributed Packages