84

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

4

3 回答 3

102

的R源代码pnorm是:

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

所以,从技术上讲,输入“pnorm”确实会显示源代码。然而,更有用的是:intentspnorm是用 C 编码的,因此在上一个问题中查看 R 中的源代码中的建议仅在外围有用(其中大部分集中在隐藏在命名空间等中的函数上)。

Uwe Ligges在 R 新闻中的文章 Accessing the Sources (p. 43) 是一个很好的通用参考。从该文件中:

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

(之所以强调是因为您询问的 ( sum) 的精确函数已在 Ligges 的文章中介绍过。)

根据您对代码挖掘的认真程度,可能值得按照 Ligges 的建议下载和解压缩源代码(例如,您可以使用命令行工具grep来搜索源代码)。对于更随意的检查,您可以通过 R Subversion 服务器Winston Chang 的 github 镜像在线查看源代码(此处的链接专门指向src/nmath/pnorm.c)。(猜测正确的位置src/nmath/pnorm.c,需要熟悉 R 源代码的结构。)

mean并且sum都在summary.c中实现。

于 2012-12-26T03:07:33.333 回答
37

我知道这篇文章已有 2 年的历史了,但我认为这可能对浏览此问题的某些用户有用。

我基本上只是复制我对这个其他类似问题的回答,以便它可能对一些想要探索 C 源文件的 R 用户有用。

  1. 首先,使用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包含函数do_matchcall

  2. 我已经把这个制表符分隔的文件放在一起,建立在names.c文件上并使用文件中查找来确定源代码的位置。有一些函数具有特定于平台的文件,还有一些函数有多个具有相关源代码的文件。但是对于其余部分,映射已经很好地建立了,至少对于当前版本(3.1.2)。

于 2015-04-17T10:49:09.257 回答
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>
于 2012-12-26T03:34:31.337 回答