我目前正在开发R-Commander GUI的插件。在此程序包中,我使用了很多其他程序包,我通过使用描述文件中的Depends选项将它们简单地附加了起来。
但是,我现在将它们切换到“导入”选项,并且遇到了一些问题。
因为我不仅要在我自己的代码中内部使用某些功能,而且还希望能够在R Commander的脚本窗口中打印和使用它们,所以我还必须将它们导出到命名空间中。
让我们以biclust
包为例。此程序包在其 namespace 中具有以下导出:
# 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)
因此,当我在R session 中使用
library(biclust)
时,它可以按预期工作,这意味着我可以在R控制台中使用biclust
方法/函数。现在,这就是我的命名空间文件的样子(或者至少是与本次讨论相关的部分)
# 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)
导入biclust软件包中定义的biclust
方法,并隐式定义方法的定义泛型。到目前为止,它们在功能上是等效的;我认为importMethodsFrom()
的初衷是当pkgA定义一个泛型时,pkgB定义该泛型上的方法,而pkgD想使用pkgA中的泛型以及pkgA和pkgB中定义的该泛型上的方法-import(pkgA,foo), importMethodsFrom(pkgB,foo)。
另一方面,当您说exportMethods(foo)
时,它指示R使包中定义的foo方法可供其他人使用。但是,您的程序包中没有定义foo方法,因此不会导出任何内容(也许这会生成错误,或者应该再次导出您导入的方法)。另一方面,export(foo)
告诉R导出可用于导出的foo泛型-这是您之前导入的符号。 (您提到过,“也将biclust方法也放入普通的export()
中”,但实际上它是可用于导出的通用(以及与之相关的任何方法)。)因此,导出biclust而不是在其上定义的方法你想做什么。
通常,我会说导入和重新导出其他软件包中定义的函数或泛型是不正确的事情-biclust(不是您的软件包)提供并记录了泛型,biclust可能属于Depends:-大概,biclust的许多其他功能通常与泛型结合使用。也许您的Rcommander GUI是个异常(exception)。
即使Imports:意味着要进行额外的工作(在NAMESPACE文件中),但通常情况下程序包属于Imports:而不是Depends:-使程序包中的代码更加健壮(在程序包名称中找到了导入的函数)空格,而不是用户可以轻松修改的搜索路径),并降低了用户在不同包中定义的相同符号之间遇到名称冲突的可能性。
关于r - 使用NAMESPACE导入/导出软件包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26970160/