2013-04-03 118 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

相关问题