2012-10-01 44 views
4

可能重複:
R: show source code of an S4 function in a package節目源代碼

我下載的軟件包(GEOquery)中,用一些功能播放。其中一個名爲Table,據我瞭解,它可以列表S4數據集。

E.g.

> 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

回答

8

從您發佈的輸出,它看起來像Table是一個S4通用的。

要查看其S4方法的列表,使用showMethods()。要查看特定的方法,請使用getMethod(),傳入所需方法的「簽名」以及函數的名稱。 ('簽名'是由參數的類別組成的字符向量,根據該參數,通用的Table執行其方法分派。如果你會做Table(GDS2853),簽名很可能會class(GDS2835)

下面是獲取代碼的S4方法在SP包的示例:

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")) 
+0

非常感謝。我必須承認,我仍然不完全明白「簽名」的含義。來自?getMethod的描述對我也沒有多大幫助。但我試過並發現,就像約書亞所提到的那樣,簽名=「GEOData」,getMethod的確給我一些進一步的跟進。 –

+0

一個側面說明 - 只是注意到(加上別人的發佈)showMethods和getMethod似乎是關於「方法」 - 不是太多關於「功能」。由於GDS下載大多是S4類,似乎我需要一個「方法」,而不是「功能」來管理數據集。它是否正確? –

+0

S4方法是函數,就像S3方法是函數一樣。如果你先看幾個S3方法,你可能會更好地解決這個問題。例如,嘗試輸入:'methods(「print」)',然後選擇一些熟悉的,然後看看它們 - 也許是'print.data.table'和'print.lm'。什麼使得這兩個函數的「方法」是它們都可以通過輸入'print(obj)'來調用:*哪個*函數的使用僅取決於'obj'類。 (我們說他們和方法(「print」)返回的100多個其他函數一起是「打印方法」。)HTH。 –

3

在您的例子,這將是:

getMethod("Table", "GEOData") 

您還可能有興趣在如何獲得S4方法的幫助文檔,裏面有需要同樣不尋常的調用:

method?Table("GEOData") 

一般來說,S4,您將需要

  • 函數名
  • 類(簽字)的對象是爲

如果您丟失後者:

class(object) 

將返回類,你也可以:

showMethods("Table") 

顯示所有當前可用的方法。另外,我發現我經常使用:

findMethods("Table") 

,原因是findMethods回報的具有特定功能的所有方法的列表。類可以有很長的名稱,我發現我經常錯誤地輸入/錯誤地使用它們,以便快速入門,findMethods("functionname")非常方便。當然,由於打印列表可能相當長,因此它也可能使用多種方法咬你的泛型函數。

+0

關於獲取方法文檔的好建議!謝謝。 – jbaums