如何查看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源代码的结构。)
mean
和sum
都在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?