2013-04-03 119 views
0

通常,當我使用R並且我想要了解該函數的功能時,我輸入函數的名稱並滾動查看代碼。然而,有時當我輸入函數的名字時,我得到的迴應沒有告訴我任何東西。將包名稱空間導入默認名稱空間

> library(limma) 
> plotMDS #can't get to the code 
function (x, ...) 
UseMethod("plotMDS") 
<environment: namespace:limma> 
> limma:::plotMDS 
function (x, ...) 
UseMethod("plotMDS") 
<environment: namespace:limma> 
> heatmap #im expecting something more like this 
function (x, Rowv = NULL, Colv = if (symm) "Rowv" else NULL, 
    distfun = dist, hclustfun = hclust, reorderfun = function(d, 
     w) reorder(d, w), add.expr, symm = FALSE, revC = identical(Colv, 
     "Rowv"), scale = c("row", "column", "none"), na.rm = TRUE, 
    margins = c(5, 5), ColSideColors, RowSideColors, cexRow = 0.2 + 
     1/log10(nr), cexCol = 0.2 + 1/log10(nc), labRow = NULL, 
    labCol = NULL, main = NULL, xlab = NULL, ylab = NULL, keep.dendro = FALSE, 
    verbose = getOption("verbose"), ...) 
{ 
    scale <- if (symm && missing(scale)) 
     "none" 
    else match.arg(scale) 
/* ... many lines removed ... */ 
    } 
    invisible(list(rowInd = rowInd, colInd = colInd, Rowv = if (keep.dendro && 
     doRdend) ddr, Colv = if (keep.dendro && doCdend) ddc)) 
} 
<bytecode: 0x16199b8> 
<environment: namespace:stats> 

因此,我想知道是否有一種方法可以導入包的命名空間爲默認命名空間,所以我可以看看代碼的函數(和調試事情變得更容易)。我一直在閱讀命名空間,但大部分時間是爲開發人員編寫的,所以它正在討論如何導出包的命名空間。

+0

你是對的。這解決了我閱讀代碼的問題,但仍然想知道是否可以將整個包名稱空間放入默認名稱空間。 – yingw 2013-04-03 21:21:27

回答

0

這是一個非常粗糙的替代,但它確實是請求的是什麼:

首先,命名空間中的內容複製到列表中的全球環境:

L <- as.list(asNamespace("yourpackage")) 

現在你可以瀏覽L或複製其所有的內容,同樣命名的全球環境中的對象與此:

invisible(lapply(names(L), function(x) eval(parse(text=paste0(x,"<-L[['",x,"']]")), globalenv()))) 

警告:這將覆蓋whateve你已經用相同的名稱定義了一個對象!所以請小心使用。

+1

如果你要這樣做,最好使用'all.names = TRUE'。 – GSee 2013-04-03 21:39:27

+0

它應該放在哪裏? – 2013-04-03 21:41:10

+0

在'as.list'調用 – GSee 2013-04-03 21:41:43

2

plotMDS是通用功能。您通過plotMDSlimma:::plotMDS訪問的內容完全相同,後者效率不高。你想得到的是這個通用函數的方法

要查看方法的plotMDS列表嘗試

methods(plotMDS) 

,將返回函數名的載體。我無法安裝LIMMA所以這裏就是我們看到底座plot通用[我當前會話]:

> methods(plot) 
[1] plot.acf*   plot.correspondence* plot.data.frame*  
[4] plot.decomposed.ts* plot.default   plot.dendrogram*  
[7] plot.density   plot.ecdf   plot.factor*   
[10] plot.formula*  plot.function  plot.hclust*   
[13] plot.histogram*  plot.HoltWinters* plot.isoreg*   
[16] plot.lda*   plot.lm    plot.mca*   
[19] plot.medpolish*  plot.mlm    plot.ppr*   
[22] plot.prcomp*   plot.princomp*  plot.profile*  
[25] plot.profile.nls* plot.ridgelm*  plot.spec   
[28] plot.stepfun   plot.stl*   plot.table*   
[31] plot.ts    plot.tskernel*  plot.TukeyHSD  

    Non-visible functions are asterisked 

要訪問非星級函數的代碼,我們只需要輸入完整的函數名,例如

> plot.density 
function (x, main = NULL, xlab = NULL, ylab = "Density", type = "l", 
    zero.line = TRUE, ...) 
{ 
.... 

要查看的代碼出演功能/方法所需的pkg:::function結構,例如對於plot.data.frame方法

> plot.data.frame 
Error: object 'plot.data.frame' not found 
> graphics:::plot.data.frame 
function (x, ...) 
{ 
.... 

如果你不知道哪個命名空間的方法屬於,然後用getAnywhere,例如

> getAnywhere(plot.data.frame) 
A single object matching ‘plot.data.frame’ was found 
It was found in the following places 
    registered S3 method for plot from namespace graphics 
    namespace:graphics 
with value 

function (x, ...) 
{ 
.... 

的印刷結果表明相關命名空間(在這種情況下graphics)加上返回的功能,或代碼的值。

+0

燁這個工作,但仍有點好奇的PKG的名稱空間 - >默認名稱空間 ''' >方法(plotMDS) [1] plotMDS.default plotMDS.MDS > getAnywhere(plotMDS。MDS) 單個對象匹配「plotMDS.MDS」發現 它是在下列地方發現 包:LIMMA 註冊S3方法用於從名稱空間LIMMA 命名空間plotMDS:LIMMA 與值 函數(X,標籤= collab(x $ distance.matrix),col = NULL, cex = 1,dim.plot = x $ dim.plot,xlab = paste(「尺寸」, dim.plot [1]),ylab = paste(「尺寸「,dim.plot [2]), ...) { /*更多代碼here */ ''' – yingw 2013-04-03 21:34:39

+0

沒有」默認「命名空間。所有的軟件包現在都必須有自己的名字空間。由單個軟件包維護者決定要導出的內容(即可見的)和不導出的內容(即不可見)。 – 2013-04-03 21:52:02

相關問題