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编程”
正如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),就可以访问这些函数的所有方法。例如,如果你想让你的头脑清醒的话,尝试一下方法(打印)。回答得真棒!