我目前正在为R-Commander GUI开发一个插件。在这个包中我使用了很多其他的包,我只是通过使用描述文件中的Depends选项来附加。 然而,我现在将它们切换到Imports选项,并且遇到了一些问题。 因为我想在我自己的代码内部使用一些函数,但也能够在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)
因此,当我在R会话中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
包,但不适用于我自己的包?
答案 0 :(得分:7)
你的错误的唯一描述是"它没有按预期工作",所以以下是在黑暗中的一点点刺。
区分方法和与之相关的泛型非常有用。 Biclust提供两者,它们紧密相关。 importFrom(biclust, biclust)
导入通用和关联方法,importMethodsFrom(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泛型, 可用于导出 - 它是您之前导入的符号。 (你提到你"将最笨的方法也放在正常的export()
"中,但实际上它是泛型(以及与之相关的任何方法)可用于因此,出口biclust而不是定义的方法似乎就是你想要做的。
通常情况下,我会说导入然后重新导出其他包中定义的函数或泛型不是正确的事情 - biclust,而不是你的包,提供和记录泛型,而bislust可能属于取决于: - 推测,来自biclust的许多其他功能通常与通用一起使用。也许您的Rcommander GUI是一个例外。
即使Imports:意味着额外的工作(在NAMESPACE文件中),通常情况下包属于Imports:而不是Depends: - 它使您的包中的代码更加健壮(导入的函数可以在包名称空间,而不是用户可以轻松修改的搜索路径),并降低用户在不同包中定义的相同符号之间经历名称冲突的可能性。