将包命名空间导入默认命名空间 [duplicate]

Importing package namespace into default namespace [duplicate]

提问人:yingw 提问时间:4/4/2013 最后编辑:Gavin Simpsonyingw 更新时间:4/4/2013 访问量:402

问:

当我使用 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>

因此,我想知道是否有办法将包的命名空间导入默认命名空间,以便我可以查看函数中的代码(并更轻松地调试)。我一直在阅读命名空间,但大多数时候它是为开发人员编写的,所以它正在谈论如何导出包的命名空间。

R 命名空间

评论

0赞 yingw 4/4/2013
你是对的。这解决了我阅读代码的问题,但仍然想知道是否可以将整个包命名空间放入默认命名空间中。

答:

3赞 Gavin Simpson 4/4/2013 #1

plotMDS是泛型函数。你通过和访问的内容是完全一样的,后者只是效率较低。你要得到的是这个泛型函数的方法plotMDSlimma:::plotMDS

查看 try 方法列表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:::functionplot.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赞 yingw 4/4/2013
是的,这有效,但仍然对 pkg 命名空间有点好奇 -> 默认命名空间 ''' > 方法(plotMDS) [1] plotMDS.default plotMDS.MDS > getAnywhere(plotMDS.MDS) 找到与“plotMDS.MDS”匹配的单个对象 它在以下地方被发现 package:limma 注册了 S3 方法,用于 plotMDS from namespace limma namespace:limma with value function (x, labels = colnames(x$distance.matrix), col = NULL, cex = 1, dim.plot = x$dim.plot, xlab = paste(“维度”, dim.plot[1]), ylab = 粘贴(“维度”, dim.plot[2]), ...){ /* 更多代码在这里*/ '''
0赞 Gavin Simpson 4/4/2013
没有“默认”命名空间。现在,所有包都必须有自己的命名空间。由各个软件包维护者决定导出哪些内容(即可见)和不导出哪些内容(即不可见)。
0赞 Ferdinand.kraft 4/4/2013 #2

这是一个非常粗略的替代方案,但它可以满足要求:

首先,将命名空间的内容复制到全局环境中的列表中:

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

现在,您可以使用以下命令将其所有内容导航或复制到全局环境中名称相同的对象:L

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

警告:这将覆盖您用相同名称定义的任何对象!所以要小心使用。

评论

1赞 GSee 4/4/2013
如果你要这样做,最好使用。all.names=TRUE
0赞 Ferdinand.kraft 4/4/2013
它应该放在哪里?
0赞 GSee 4/4/2013
在通话中as.list
0赞 GSee 4/4/2013
鉴于(如果答案是parse(),你通常应该重新考虑这个问题。fortunes::fortune(106)L <- as.list(getNamespace("yourpackage"), all.names=TRUE); for (i in seq_along(L)) assign(names(L)[i], L[[i]], pos=globalenv())
0赞 Ferdinand.kraft 4/4/2013
@GSee,我同意,这是对一个严重问题的粗略解决方案。顺便说一句,你的代码比我的好(或更差)。:-)