使用NAMESPACE导入/导出软件包

w

我目前正在开发R-Commander GUI的插件。在此程序包中,我使用了很多其他程序包,只需通过在描述文件中使用Depends选项将它们附加即可。但是,现在我将它们切换到“导入”选项,并且遇到了一些问题。因为我不仅要在自己的代码中内部使用某些功能,而且还希望能够在R Commander的脚本窗口中打印和使用它们,所以我还必须将它们导出到命名空间中。

让我们以biclust包装为例此程序包在其名称空间中具有以下导出:

# First a bunch of functions are exported (Note that the biclust function is not in here!)
export(drawHeatmap,drawHeatmap2,bubbleplot,...,heatmapBC)

# The classes are exported
exportClasses(BiclustMethod,Biclust,BCBimax,BCCC,BCXmotifs,BCSpectral,BCPlaid)

# Methods are exported
exportMethods(biclust,show,summary)

因此,当我library(biclust)在R会话中时,它可以按预期工作,这意味着我可以biclust在R控制台中使用方法/函数。

现在,这就是我的命名空间文件的样子(或者至少是与本次讨论相关的部分)

# I select those functions I need and import them.
importFrom(biclust, drawHeatmap,...,biclustbarchart)

# I import all the classes
importClassesFrom(biclust,BiclustMethod,Biclust,BCBimax,BCCC,BCXmotifs,BCSpectral,BCPlaid)

# I import all the methods
importMethodsFrom(biclust,show,summary,biclust)

# I now export all of the previous again so I can use the doItAndPrint functionality in R Commander
export( drawHeatmap,...,biclustbarchart)
exportClasses(BiclustMethod,Biclust,BCBimax,BCCC,BCXmotifs,BCSpectral,BCPlaid)
exportMethods(biclust,show,summary)

但是,当我现在加载自己的程序包时,它无法正常工作。虽然诸如此类的函数drawHeatmap正在运行,但biclust找不到方法/函数。(尽管我已经清楚地导入和导出了该方法。)

看来,使此功能起作用的唯一方法是将biclust方法也放入普通export()命令中。

export(biclust,drawHeatmap,...,biclustbarchart)

有人可以澄清我做错了什么还是发生了什么事?为什么同一出口适用于该biclust包装,而不适用于我自己的包装?

马丁·摩根

您对错误的唯一描述是“它没有按预期方式工作”,因此以下内容是暗中的一点刺伤。

区分方法和与之关联的泛型很有用。Biclust使两者都可用,并且它们紧密相关。importFrom(biclust, biclust)导入通用方法和关联方法,importMethodsFrom(biclust, biclust)导入biclustbiclust程序包中定义方法,并隐式定义用于定义方法的泛型。到目前为止,它们在功能上是等效的;我认为最初的意图importMethodsFrom()是当pkgA定义泛型时,pkgB定义泛型上的方法,而pkgD想使用pkgA中的泛型以及pkgA和pkgB中定义的该泛型上的方法-import(pkgA,foo),importMethodsFrom (pkgB,foo)。

另一方面,当您说时exportMethods(foo),它指示R使包中定义的foo方法可供他人使用。但是,您的程序包中没有定义foo方法,因此不会导出任何内容(可能会生成错误,或者应该再次导出您导入的方法)。在另一方面,export(foo)讲述R键导出富通用,这可供出口-它的符号,你早一点进口。(您提到过,“也将biclust方法也放入普通方法中export()”,但实际上它是可用于导出通用方法(以及与之相关的任何方法)。)因此,导出biclust而不是在其上定义的方法你想做。

通常,我会说导入并重新导出其他软件包中定义的函数或泛型不是正确的事情-biclust(不是您的软件包)提供并记录了泛型,biclust可能属于Depends:-大概,biclust的许多其他功能通常与泛型结合使用。也许您的Rcommander GUI是个例外。

即使Imports:意味着要进行额外的工作(在NAMESPACE文件中),但通常情况下程序包属于Imports:而不是Depends:-使程序包中的代码更加健壮(在程序包名称中找到了导入的函数)空格,而不是用户可以轻松修改的搜索路径),并减少了用户在不同包中定义的相同符号之间遇到名称冲突的可能性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章