【问题标题】:How can I read the source code for an R function?如何阅读 R 函数的源代码?
【发布时间】:2019-07-09 22:17:32
【问题描述】:

我有一个数据框,我想了解摘要如何生成它的信息。具体来说,summary 如何生成一个因子每个级别中的元素数量的计数。我可以使用摘要,但我想学习如何更好地使用因子。当我尝试 ?summary 时,我只会得到一般信息。这是不可能的,因为它是在字节码中吗?

【问题讨论】:

  • 在控制台尝试> summary.data.frame
  • 查看?methods 并尝试methods(summary),这应该会引导您访问summary.data.frame,它记录在?summary 中。
  • 这个问答更加明确:stackoverflow.com/questions/19226816/…

标签: r r-faq


【解决方案1】:

当您输入 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 时的代码不同。这很好,因为我们不希望对这两个对象以相同的方式进行汇总。

要查看在 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 中的代码。

有关更多详细信息,您可以查看 Volume 6/4 of The R Journal (warning, pdf) 并阅读 Uwe Ligge 的“R 帮助台”部分,该部分涉及查看 R 函数的源代码。

【讨论】:

  • 很好解释。 methods(class=data.frame) 也可以提及。
猜你喜欢
  • 2019-04-16
  • 2019-01-09
  • 2013-05-16
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多