Function 如何检查R中';s对象类敏感

Function 如何检查R中';s对象类敏感,function,r,Function,R,我正试图编写一个函数来完成一项特定的工作(在我的例子中,分析数据集中的异常值),所以我想做的第一件事就是看看其他人是如何完成类似工作的 我可以这样做来加载一个特定的包并检查一个函数的代码,但是有些函数似乎取决于您向它抛出的对象的类别 >library(outliers) > fix(outlier) function (x, opposite = FALSE, logical = FALSE) { if (is.matrix(x)) apply(x, 2

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

我可以这样做来加载一个特定的包并检查一个函数的代码,但是有些函数似乎取决于您向它抛出的对象的类别

>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)
        }
    }
}
>库(异常值)
>修正(异常值)
函数(x,对向=FALSE,逻辑=FALSE)
{
如果(是矩阵(x))
应用(x,2,异常值,对向=对向,逻辑=逻辑)
else if(is.data.frame(x))
sapply(x,异常值,相反=相反,逻辑=逻辑)
否则{
如果(xor(((最大(x)-平均(x))<(平均(x)-最小(x)),相反)){
如果(!逻辑)
最小值(x)
否则x==min(x)
}
否则{
如果(!逻辑)
最大值(x)
否则x==最大值(x)
}
}
}
您如何查看根据对象而变化的代码

编辑:

好的,当你说

函数做了其他事情 取决于对象的类 扔给它

您已经是S3调度机制的核心!所以 我建议你读一本关于R的编程书

  • (经典但过时)Venables/Ripley的编程
  • 绅士“带R的生物信息学”
  • Brown/Murdoch“与R
  • 钱伯斯“数据分析软件:用R编程”
或来自的其他资源,以及来自丰富的CRAN包集的一个或两个示例包。

例如,plot()将根据对象执行不同的操作。可以使用plot.ts()、plot.lm()等查看特定的plot函数(称为方法)。例如,如果传递了ts对象,plot()将调用plot.ts()。通常,plot.xxx()应用于类xxx的对象。如果该类没有特定的方法,则使用plot.default()

函数plot()被称为泛型函数,因为它可以应用于许多不同的类。其他常见的泛型函数有summary()、print()和predict()


正如Dirk所说,非常值得阅读有关S3方法和类的文档

我寻找函数代码的思路是:

首先,键入函数的名称

案例1:它显示了代码 太好了,你完成了

示例:diag

案例2:函数显示为一行UseMethod语句 您有一个S3方法。 键入
methods(fnname)
查看可用的方法, 然后
getAnywhere(fnname.myclass)

示例:平均值

methods(mean)
getAnywhere(mean.default)
案例3:函数包含.Internal或.Primitive语句 该函数是用C编写的,以提高性能。 下载R源代码的副本并提取tarball。 在src目录中搜索函数名

编辑:您还可以使用谷歌或雅虎网站搜索来搜索该文件

site:https://svn.r-project.org/R/trunk/src functionname
结束编辑

示例:qnorm

在R源代码的src目录中对“qnorm”进行一次简单的windows搜索,就会发现包含函数定义的文件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")
库(pixmap)

pixie关于答案中未涉及的另一个案例,请参见“”中报告的答案

它处理在运行方法(function.I.am.looking.for)时显示为“不可见”的函数的情况

简而言之,然后可以使用以下形式的命令:package:::function.class
查看您想要的代码。

我最近偶然发现了,它基本上保存了CRAN存储库中所有包的只读版本。您可以通过包名进行搜索,在选择了您所在的包之后,在其中有一个名为R的文件夹,其中包含了R中的源代码

例如,我搜索包mboost,单击in并进入R文件夹,显示如下

我还没有遇到过找不到我想要的东西的情况。
我还没有看到是否显示或链接了所有底层C/C++代码,但这是针对上面的mboost示例的。c代码位于另一个名为src

的顶级文件夹中,如果您感到好奇,只需输入方法(functionname),就可以访问这些函数的所有方法。例如,如果你想让你的头脑清醒的话,尝试一下方法(打印)。回答得真棒!