我该如何阅读R函数的源代码?

14

我有一个数据框架,想要了解summary函数如何生成信息。特别是,summary如何计算因子的每个级别中元素数量的计数。我可以使用summary函数,但我想学习更好地处理因子。当我尝试使用?summary时,只能得到一般信息。这是因为它是字节码而无法实现吗?


1
在控制台上尝试使用 > summary.data.frame - kohske
请查看?methods并尝试methods(summary),这将引导您到summary.data.frame,该函数在?summary中有文档说明。 - Joshua Ulrich
这个问题的答案在这里更加明确:https://dev59.com/h2Ik5IYBdhLWcg3wfOOe - Ari B. Friedman
1个回答

38
当您输入summary时,我们看到的是:
> summary
function (object, ...) 
UseMethod("summary")
<bytecode: 0x0456f73c>
<environment: namespace:base>

这句话告诉我们,summary是一个通用函数,并且有许多附加方法。为了查看这些方法的实际名称,我们可以尝试:
> methods(summary)
 [1] summary.aov             summary.aovlist         summary.aspell*        
 [4] summary.connection      summary.data.frame      summary.Date           
 [7] summary.default         summary.ecdf*           summary.factor         
[10] summary.glm             summary.infl            summary.lm             
[13] summary.loess*          summary.manova          summary.matrix         
[16] summary.mlm             summary.nls*            summary.packageStatus* 
[19] summary.PDF_Dictionary* summary.PDF_Stream*     summary.POSIXct        
[22] summary.POSIXlt         summary.ppr*            summary.prcomp*        
[25] summary.princomp*       summary.srcfile         summary.srcref         
[28] summary.stepfun         summary.stl*            summary.table          
[31] summary.tukeysmooth*   

   Non-visible functions are asterisked

这里我们可以看到与 summary 函数相关的所有方法。这意味着在调用 lm 对象的 summary 和调用 data.frame 的 summary 时会有不同的代码。这是很好的,因为我们不希望这两个对象的摘要以相同的方式进行处理。
要查看在调用数据框的摘要时运行的代码,只需键入
summary.data.frame

根据方法列表所示,您可以查看、学习并使用打印的代码。您提到您对因子感兴趣,因此您可能想要查看summary.factor的输出结果。现在您可能会注意到,一些打印出来的方法旁边有一个星号(*),这意味着它们是不可见的。这基本上意味着您不能只输入函数名称来尝试查看代码。
> summary.prcomp
Error: object 'summary.prcomp' not found

然而,如果您决心查看代码实际内容,可以使用 getAnywhere 函数来查看。

> getAnywhere(summary.prcomp)
A single object matching ‘summary.prcomp’ was found
It was found in the following places
  registered S3 method for summary from namespace stats
  namespace:stats
with value

function (object, ...) 
{
    vars <- object$sdev^2
    vars <- vars/sum(vars)
    importance <- rbind(`Standard deviation` = object$sdev, `Proportion of Variance` = round(vars, 
        5), `Cumulative Proportion` = round(cumsum(vars), 5))
    colnames(importance) <- colnames(object$rotation)
    object$importance <- importance
    class(object) <- "summary.prcomp"
    object
}
<bytecode: 0x03e15d54>
<environment: namespace:stats>

希望这能帮助你更轻松地探索R编程方面的代码。如需更多细节,你可以查看《The R Journal》第6卷4期(警告,pdf文件,并阅读Uwe Ligge的“R Help Desk”部分,该部分涉及查看R函数源代码。

1
讲解得很清楚。也可以提到 methods(class=data.frame) - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接