UseMethod("t")
告诉您这t()
是(S3)泛型函数,具有用于不同对象类的方法。
S3方法调度系统
对于S3类,可以使用该methods
函数列出特定泛型函数或类的方法。
> methods(t)
[1] t.data.frame t.default t.ts*
Non-visible functions are asterisked
> methods(class="ts")
[1] aggregate.ts as.data.frame.ts cbind.ts* cycle.ts*
[5] diffinv.ts* diff.ts kernapply.ts* lines.ts
[9] monthplot.ts* na.omit.ts* Ops.ts* plot.ts
[13] print.ts time.ts* [<-.ts* [.ts*
[17] t.ts* window<-.ts* window.ts*
Non-visible functions are asterisked
“不可见的功能带有星号”表示该功能未从其程序包的命名空间中导出。您仍然可以通过:::
函数(即stats:::t.ts
)或使用查看源代码getAnywhere()
。 getAnywhere()
之所以有用,是因为您不必知道函数来自哪个包。
> getAnywhere(t.ts)
A single object matching ‘t.ts’ was found
It was found in the following places
registered S3 method for t from namespace stats
namespace:stats
with value
function (x)
{
cl <- oldClass(x)
other <- !(cl %in% c("ts", "mts"))
class(x) <- if (any(other))
cl[other]
attr(x, "tsp") <- NULL
t(x)
}
<bytecode: 0x294e410>
<environment: namespace:stats>
S4方法调度系统
S4系统是更新的方法调度系统,是S3系统的替代方法。这是一个S4函数的示例:
> library(Matrix)
Loading required package: lattice
> chol2inv
standardGeneric for "chol2inv" defined from package "base"
function (x, ...)
standardGeneric("chol2inv")
<bytecode: 0x000000000eafd790>
<environment: 0x000000000eb06f10>
Methods may be defined for arguments: x
Use showMethods("chol2inv") for currently available ones.
输出已经提供了很多信息。standardGeneric
是S4功能的指示器。查看定义的S4方法的方法很有帮助:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
可以用来查看方法之一的源代码:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
还有一些方法,每种方法的签名都比较复杂,例如
require(raster)
showMethods(extract)
Function: extract (package raster)
x="Raster", y="data.frame"
x="Raster", y="Extent"
x="Raster", y="matrix"
x="Raster", y="SpatialLines"
x="Raster", y="SpatialPoints"
x="Raster", y="SpatialPolygons"
x="Raster", y="vector"
要查看这些方法之一的源代码,必须提供完整的签名,例如
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
提供部分签名是不够的
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
调用未导出函数的函数
在的情况下ts.union
,.cbindts
和.makeNamesTs
来自未导出函数stats
的命名空间。您可以使用:::
运算符或查看未导出功能的源代码getAnywhere
。
> stats:::.makeNamesTs
function (...)
{
l <- as.list(substitute(list(...)))[-1L]
nm <- names(l)
fixup <- if (is.null(nm))
seq_along(l)
else nm == ""
dep <- sapply(l[fixup], function(x) deparse(x)[1L])
if (is.null(nm))
return(dep)
if (any(fixup))
nm[fixup] <- dep
nm
}
<bytecode: 0x38140d0>
<environment: namespace:stats>
调用已编译代码的函数
请注意,“已编译”并不表示由编译器程序包创建的字节编译R代码。的<bytecode: 0x294e410>
上面输出中行表明该函数是字节编译的,您仍然可以从R命令行查看源代码。
功能这一呼吁.C
,.Call
,.Fortran
,.External
,.Internal
,或.Primitive
在编译代码呼吁入口点,所以你必须看看编译代码的来源,如果你想充分了解该功能。这将R源代码GitHub的反射镜是一个体面的地方开始。该功能pryr::show_c_source
可以像它会带你直接到GitHub的页面,一个有用的工具.Internal
和.Primitive
电话。包可以使用.C
,.Call
,.Fortran
,和.External
; 但不是.Internal
或.Primitive
,因为它们用于调用R解释器中内置的函数。
调用上述某些函数可能会使用对象而不是字符串来引用已编译的函数。在这些情况下,对象是类的"NativeSymbolInfo"
,"RegisteredNativeSymbol"
或"NativeSymbol"
; 打印对象会产生有用的信息。例如,optim
调用.External2(C_optimhess, res$par, fn1, gr1, con)
(请注意是C_optimhess
,不是"C_optimhess"
)。 optim
在stats包中,因此您可以键入stats:::C_optimhess
以查看有关所调用的已编译函数的信息。
包中已编译的代码
如果要查看软件包中的编译代码,则需要下载/解压缩软件包源代码。安装的二进制文件不足。可以从最初安装该软件包的同一CRAN(或与CRAN兼容)的存储库中获取软件包的源代码。该download.packages()
函数可以为您获取软件包源。
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
这将下载Matrix软件包的源版本,并将相应的.tar.gz
文件保存在当前目录中。可以src
在未压缩和未压缩文件的目录中找到已编译函数的源代码。可以在函数外部R
或内部R
使用来完成解压缩和解压缩步骤untar()
。可以将下载和扩展步骤组合为一个调用(请注意,每次只能通过这种方式下载和解压缩一个包):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
另外,如果包开发是公开托管的(例如,通过GitHub,R-Forge或RForge.net),则您可能可以在线浏览源代码。
基本包中的已编译代码
某些软件包被视为“基本”软件包。这些程序包随R和他们的版本被锁定到R.实例的版本包括base
,compiler
,stats
,和utils
。因此,如上所述,它们不能作为CRAN上的单独可下载软件包使用。相反,它们是R源树中位于的单独程序包目录中的一部分/src/library/
。下一节将介绍如何访问R源。
R解释器中内置的已编译代码
如果要查看R解释器内置的代码,则需要下载/解压缩R源。或者您可以通过R Subversion存储库或Winston Chang的github镜像在线查看源代码。
Uwe Ligges的R新闻文章(PDF)(第43页)是如何查看.Internal
和.Primitive
函数源代码的很好的一般参考。基本步骤是首先在中查找函数名称src/main/names.c
,然后在中的文件中搜索“ C条目”名称src/main/*
。