2009-09-17 25 views
8

我正在嘗試編寫一個函數來執行特定的工作(在我的情況下,分析異常值的數據集),所以我想做的第一件事看看其他人做了類似的工作。如何檢查R中對象類敏感的函數的代碼

我能做到這一點加載特定的軟件包,並檢查一個函數的代碼,但是一些功能似乎取決於你把什麼類的對象吧

>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) 
     } 
    } 
} 

你怎麼能看代碼什麼東西根據物體而變化?

編輯:

OK,棕櫚< - 臉。我用作示例的函數只是調用它自己,但是他所編寫的代碼都在那裏......我已經看到了其他示例(但不能想到任何副手),函數根據拋出的對象的類別做了其他事情在這個問題上,即使這是一個不好的例子,問題仍然存在。

回答

7

當你說

功能確實做其他事情 取決於該對象的類別 在它

你已經在S3調度機制的心臟扔!所以 我會推薦閱讀一本關於R的編程書籍,例如

  • (經典但日)維納布爾斯/裏普利 「S編程」,
  • 君子 「生物信息學與R」,
  • 棕色/默多克 「第一場與R統計編程」,
  • 房間「用於數據分析的軟件:用R編程「,

或來自this SO question on R books的其他資源以及來自豐富的CRAN包的一個或兩個示例包。

4

例如,plot()會根據對象做不同的事情。您可以使用plot.ts(),plot.lm()等來查看特定的繪圖函數(稱爲方法),即如果ts對象被傳遞,則plot()將調用plot.ts()。一般情況下,plot.xxx()應用於類xxx的對象。如果該類沒有特定的方法,則使用plot.default()。

函數plot()被稱爲泛型函數,因爲它可以應用於許多不同的類。其他常見的通用函數是summary(),print()和predict()。

正如Dirk所說,很值得閱讀關於S3方法和類的文檔。

+2

另一個頂級文件夾,然後如果你很好奇,你可以通過輸入方法(functionname)訪問所有的任何這些功能的方法。例如,嘗試方法(打印),如果你想讓自己的頭腦被打破。 – 2009-09-18 01:53:27

28

我的查找功能代碼的思維過程往往是:

首先,鍵入功能

案例1名:它顯示了代碼

大,你就大功告成了。

舉例:診斷

案例2:功能出現的一行UseMethod聲明

您有一個S3方法。 類型methods(fnname)查看可用方法, 然後getAnywhere(fnname.myclass)

實施例:平均

methods(mean) 
getAnywhere(mean.default) 
情況3:該功能包含一個或。內部語句.Primitive

的功能是用C,以提高性能。 下載R源代碼的副本並提取tarball。 在src目錄中搜索函數名稱。

編輯:您也可以使用谷歌或雅虎網站搜索搜索文件。

site:https://svn.r-project.org/R/trunk/src functionname 

結束EDIT

實施例:qnorm

一個簡單的Windows搜索在R源代碼的src目錄 「qnorm」 揭示了文件qnorm.c,其中包含功能定義。

編輯: qnorm.c也是從搜索上面結果

site:https://svn.r-project.org/R/trunk/src qnorm 

編輯完

案例4:仍然無法找到函數

這可能是一個S4類的方法。

類型class(myobj)找到類。

鍵入showMethods(class="myclass")找到該類的可用方法。

類型getMethods("fnname", "myclass")

實施例:情節的pixmap

這需要像素映像包。

library(pixmap) 
pixie <- pixmap(1:12, nrow=3, ncol=4) 
class(pixie) #"pixmap" 
showMethods(class="pixmap") 
getMethod("plot", "pixmap") 
+0

真棒回答! – MaHo 2017-10-16 13:51:08

0

未規定在這裏看到報道中的「view source code in R

其與該顯示爲「不可見」的功能,當你運行方法的情況下交易(功能答案的答案另一種情況.I.am.looking.for)

總之,您可以使用以下格式的命令:package ::: function.class 來查看您想要的代碼。

0

我最近偶然發現了CRAN Meta repository on GitHub,它基本上保存了CRAN存儲庫中所有軟件包的只讀版本。您可以通過包名稱進行搜索,選擇你之後有一個叫[R內的文件夾,裏面有在R.

例如,源代碼包後,我搜索了包mboost,被點擊上並輸入R文件夾,其中顯示此list of code

我還沒有案件,但我無法找到我以後的事情。 我也沒有看到全部底層的C/C++代碼是顯示還是鏈接,但它是上面的示例示例。在C代碼是在一個名爲SRC

相關問題