Ewo*_*oud 9 import namespaces export r
我目前正在为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)
Run Code Online (Sandbox Code Playgroud)
因此,当我library(biclust)在R会话中,它按预期工作,这意味着我可以使用biclustR控制台中的方法/功能.
现在这是我的命名空间文件的样子(或至少它与此讨论相关的部分)
# 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)
Run Code Online (Sandbox Code Playgroud)
但是,当我现在加载我自己的包时,它没有按预期工作.当功能如drawHeatmap工作时,biclust无法找到方法/功能.(虽然我已经明确导入并导出了该方法.)
看似唯一的方法就是将biclust方法也放在正常的export()命令中.
export(biclust,drawHeatmap,...,biclustbarchart)
Run Code Online (Sandbox Code Playgroud)
有人可以澄清我做错了什么或者这里发生了什么?为什么相同的导出适用于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键导出富通用,这是可供出口的-这是你以前导入的符号.(你提到你"把双重方法也放在正常情况下export()",但实际上它是可用于导出的通用(以及与之相关的任何方法).)因此,导出biclust而不是在其上定义的方法似乎是什么你想做什么.
通常,我会说导入然后重新导出其他包中定义的函数或泛型不是正确的事情 - biclust,而不是你的包,提供和文档通用,而bislust可能属于取决于: - 据推测,来自biclust的许多其他功能通常与通用一起使用.也许您的Rcommander GUI是一个例外.
尽管Imports:意味着额外的工作(在NAMESPACE文件中),但通常情况下包属于Imports:而不是Depends: - 它使得包中的代码更加健壮(导入的函数可以在包名中找到)空间,而不是用户可以轻松修改的搜索路径),并降低用户在不同包中定义的相同符号之间经历名称冲突的可能性.