如何检查R中对象类敏感的函数的代码

时间:2009-09-17 14:47:57

标签: function r

我正在尝试编写一个函数来完成一项特定的工作(在我的例子中,分析异常值的数据集)所以我想要做的第一件事就是看看其他人是如何完成类似工作的。

我可以这样做来加载一个特定的包并检查一个函数的代码,但是一些函数似乎依赖于你抛出的对象类

>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。我作为一个例子使用的函数只调用自己,但是他的代码就在那里......我已经看到了其他的例子(但是不能想到任何随便的)函数确实做了其他事情,这取决于抛出的对象的类在它,所以问题就在于,即使这是一个坏榜样!

5 个答案:

答案 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上阅读一本编程书,例如

  • (经典但过时)Venables / Ripley“S Programming”,
  • Gentleman“生物信息学与R”,
  • 布朗/默多克“用R统计编程的第一门课程”,
  • Chambers“数据分析软件:用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

的顶级文件夹中