如何查看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) 

所以,从技术上讲,input“pnorm” 显示你的源代码。 然而,更有用的是: pnorm是用C语言编写的,所以前面的问题视图源代码中的build议只是在外围是有用的(大部分集中在隐藏在命名空间中的函数等)。

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

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

(强调的补充,因为你问的关于( sum )的确切function在Ligges的文章中有介绍。)

根据你想要挖掘代码的严重程度,可能需要像Ligges所说的那样下载和解压缩源代码(例如,你可以使用命令行工具,例如grep来search源代码)。 对于更加随意的检查,您可以通过R Subversion服务器或Winston Chang的github镜像在线查看源代码(这里的链接专门针对src/nmath/pnorm.c )。 ( src/nmath/pnorm.c正确的地方, src/nmath/pnorm.c ,需要熟悉R源代码的结构。)

meansum都是在summary.c中实现的。

我知道这个post是2岁以上,但我认为这可能是有用的浏览这个问题的一些用户。

我基本上只是把我的答案复制到其他类似的问题上,这样对于一些想要探索C源代码文件的R用户来说也许是有用的。

  1. 首先,使用pryr,你可以使用show_c_source函数,它将在GitHub上searchC源文件中的相关代码片段。 适用于.Internal和.Primitivefunction。

     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. 我把这个制表符分隔的文件放在一起,build立在names.c文件上,并使用find-in-files来确定源代码的位置。 有一些函数具有特定于平台的文件,还有一些函数具有多个具有相关源代码的文件。 但是对于其余的映射来说,至less在当前版本(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>