我正在尝试编写一个函数来完成一项特定的工作(在我的例子中,分析异常值的数据集)所以我想要做的第一件事就是看看其他人是如何完成类似工作的。
我可以这样做来加载一个特定的包并检查一个函数的代码,但是一些函数似乎依赖于你抛出的对象类
>library(outliers)
> fix(outlier)
function (x, opposite = FALSE, logical = FALSE)
{
if (is.matrix(x))
apply(x, 2, outlier, opposite = opposite, logical = logical)
else if (is.data.frame(x))
sapply(x, outlier, opposite = opposite, logical = logical)
else {
if (xor(((max(x) - mean(x)) < (mean(x) - min(x))), opposite)) {
if (!logical)
min(x)
else x == min(x)
}
else {
if (!logical)
max(x)
else x == max(x)
}
}
}
如何看待根据对象发生变化的代码?
编辑:
好的,Palm&lt; - face。我作为一个例子使用的函数只调用自己,但是他的代码就在那里......我已经看到了其他的例子(但是不能想到任何随便的)函数确实做了其他事情,这取决于抛出的对象的类在它,所以问题就在于,即使这是一个坏榜样!
答案 0 :(得分:31)
我找到功能代码的思维过程往往是:
首先,输入函数的名称
案例1:它显示了代码太好了,你做完了。
示例:diag
情况2:该函数作为一行UseMethod语句出现你有一个S3方法。
输入methods(fnname)
查看可用的方法,
然后getAnywhere(fnname.myclass)
。
示例:卑鄙
methods(mean)
getAnywhere(mean.default)
情况3:该函数包含.Internal或.Primitive语句
该函数以C语言编写,以提高性能。 下载R源代码的副本并解压缩tarball。 在src目录中搜索函数名称。
编辑:您还可以使用Google或Yahoo网站搜索来搜索该文件。
site:https://svn.r-project.org/R/trunk/src functionname
结束编辑
示例:qnorm
在R源代码的src目录中搜索“qnorm”的简单窗口显示文件qnorm.c,其中包含函数定义。
修改强> qnorm.c也是搜索的最高结果
site:https://svn.r-project.org/R/trunk/src qnorm
结束编辑
案例4:仍然找不到功能这可能是S4类的一种方法。
输入class(myobj)
以查找课程。
键入showMethods(class="myclass")
以查找该类的可用方法。
输入getMethods("fnname", "myclass")
。
示例:plot pixmap
这需要pixmap包。
library(pixmap)
pixie <- pixmap(1:12, nrow=3, ncol=4)
class(pixie) #"pixmap"
showMethods(class="pixmap")
getMethod("plot", "pixmap")
答案 1 :(得分:7)
当你说
时该功能确实做了其他事情 取决于对象的类 抛出它
您已经处于S3调度机制的核心位置!所以 我建议你在R上阅读一本编程书,例如
来自this SO question on R books的其他资源以及来自丰富CRAN软件包的示例软件包。
答案 2 :(得分:4)
例如,plot()将根据对象执行不同的操作。您可以使用plot.ts(),plot.lm()等查看特定的绘图函数(称为方法)。即,如果传递了ts对象,plot()将调用plot.ts()。通常,plot.xxx()应用于类xxx的对象。如果该类没有特定的方法,则使用plot.default()。
函数plot()被称为泛型函数,因为它可以应用于许多不同的类。其他常见的通用函数是summary(),print()和predict()。
正如Dirk所说,非常值得阅读有关S3方法和类的文档。
答案 3 :(得分:0)
对于答案中未涉及的其他案例,请参阅“view source code in R”
中报告的答案处理运行方法时显示为“不可见”的函数的情况(function.I.am.looking.for)
简而言之,您可以使用以下形式的命令:package ::: function.class 看到你想要的代码。
答案 4 :(得分:0)
我最近偶然发现了CRAN Meta repository on GitHub,它基本上保存了CRAN存储库中所有包的只读版本。在有一个名为 R 的文件夹后,您可以按照包名称进行搜索,其中包含R中的源代码。
例如,我搜索了包 mboost ,点击了输入并输入了 R 文件夹,其中显示了此list of code。
我还没有找到我无法找到的内容。 我还没有看到 ALL 底层C / C ++代码是否被显示或链接,但它是针对上面的 mboost 示例。 c代码位于另一个名为 src
的顶级文件夹中