【问题标题】:show source code for a function in a package in R [duplicate]显示 R 包中函数的源代码 [重复]
【发布时间】:2012-10-01 19:42:58
【问题描述】:

可能重复:
R: show source code of an S4 function in a package

我下载了一个包 (GEOquery) 并正在使用其中的一些功能。其中之一称为Table,据我了解,它能够将S4 数据集制成表格。

例如

> summary(GDS2853) # GDS2853 is a dataset I downloaded from NCBI 
Length  Class   Mode 
     1    GDS     S4 

getAnywhere(Table) 显示

> getAnywhere(Table)
A single object matching ‘Table’ was found
It was found in the following places
  package:GEOquery
  namespace:GEOquery
with value

function (object) 
standardGeneric("Table")
<environment: 0x06ad5268>
attr(,"generic")
[1] "Table"
attr(,"generic")attr(,"package")
[1] "GEOquery"
attr(,"package")
[1] "GEOquery"
attr(,"group")
list()
attr(,"valueClass")
character(0)
attr(,"signature")
[1] "object"
attr(,"default")
`\001NULL\001`
attr(,"skeleton")
function (object) 
stop("invalid call in method dispatch to \"Table\" (no default method)", 
    domain = NA)(object)
attr(,"class")
[1] "standardGeneric"
attr(,"class")attr(,"package")
[1] "methods"

我想学习Table 的代码,这样我就可以知道如何将 GDS 数据集制成表格,因为 data.frameas.list 无法强制 S4 类 - 尽管我可以将 GDS 制成表格数据集,例如,

GDS_table=Table(GDS2853)[1:20000,1:20] #GDS2853 contains 20 columns
and approx 17000 rows 

我按照其他帖子中的建议尝试了getMethods,但下面是我得到的

> getMethod("Table")
Error in getMethod("Table") : 
  No method found for function "Table" and signature

我还尝试通过输入package=:GEOquery 来指定“位置”,但显然package 是一个未使用的参数。

想知道我做错了什么以至于看不到Table的源代码。

【问题讨论】:

    标签: r s4


    【解决方案1】:

    从您发布的输出来看,Table 似乎是 S4 泛型。

    要查看其 S4 方法的列表,请使用 showMethods()。要查看特定方法,请使用getMethod(),并传入所需方法的“签名”以及函数名称。 (“签名”是由参数的类组成的字符向量,通用Table 根据该类执行其方法分派。即,如果您将执行Table(GDS2853),则签名可能是class(GDS2835))

    这是一个获取 sp 包中 S4 方法代码的示例:

    library(sp)
    
    showMethods("overlay")
    # Function: overlay (package sp)
    # x="SpatialGrid", y="SpatialPoints"
    # x="SpatialGrid", y="SpatialPolygons"
    # x="SpatialGridDataFrame", y="SpatialPoints"
    # x="SpatialGridDataFrame", y="SpatialPolygons"
    # x="SpatialPixels", y="SpatialPoints"
    # x="SpatialPixelsDataFrame", y="SpatialPoints"
    # x="SpatialPoints", y="SpatialPolygons"
    # x="SpatialPointsDataFrame", y="SpatialPolygons"
    # x="SpatialPolygons", y="SpatialGrid"
    # x="SpatialPolygons", y="SpatialPoints"
    
    getMethod("overlay", signature=c("SpatialGrid", "SpatialPoints"))
    

    【讨论】:

    • 非常感谢大家。我必须承认我仍然不明白“签名”的确切含义。 ?getMethod 的描述对我也没有多大帮助。但我尝试发现,就像 Joshua 提到的那样,使用 signature="GEOData",getMethod 确实让我得到了一些进一步跟进的东西。
    • 附注 - 刚刚注意到(加上其他人的帖子)showMethods 和 getMethod 似乎都是关于“方法” - 而不是关于“功能”。由于 GDS 下载主要是一个 S4 类,我似乎需要一个“方法”,而不是一个“函数”来管理数据集。这是正确的吗?
    • S4 方法是函数,就像 S3 方法是函数一样。如果您从查看一些 S3 方法开始,您可能会更好地理解这一点。例如,尝试输入:methods("print"),然后选择一些熟悉的,然后查看它们——可能是print.data.tableprint.lm。使这两个函数成为“方法”的原因在于它们都可以通过键入print(obj) 来调用:使用哪个 函数仅取决于obj 的类。 (我们说它们以及 methods("print") 返回的 100 多个其他函数都是“打印方法”。)HTH。
    【解决方案2】:

    在您的示例中,它将是:

    getMethod("Table", "GEOData")
    

    您可能还对如何获取 S4 方法的帮助文档感兴趣,该方法同样需要不寻常的调用:

    method?Table("GEOData")
    

    通常,使用 S4,您将需要

    • 函数名
    • 对象的类(签名)

    如果你对后者感到迷茫:

    class(object)
    

    将返回类,你也可以这样做:

    showMethods("Table")
    

    显示所有当前可用的方法。或者,我发现我经常使用:

    findMethods("Table")
    

    原因是findMethods 返回特定函数的所有方法的列表。类可以有很长的名称,我发现我经常输入错误/大写错误,所以作为快速破解,findMethods("functionname") 很方便。当然,由于打印的列表可能很长,因此它也可能会为您提供具有许多方法的泛型函数。

    【讨论】:

    • 关于获取方法文档的好技巧!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2013-11-06
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2011-03-29
    • 2016-10-05
    相关资源
    最近更新 更多