【问题标题】:How to use/maintain my S4 class with same name as S4 class in another R package?如何在另一个 R 包中使用/维护与 S4 类同名的 S4 类?
【发布时间】:2016-08-31 12:13:35
【问题描述】:

如何在另一个 R 包中使用/维护与 S4 类同名的 S4 类?

我正在编写一个包含名为“FeatureSet”的 S4 类的大型 R 包。不幸的是,这也是广泛使用的“oligo”包中的虚拟 S4 类的名称。当我先加载我的包,然后是oligo,然后调用

new("FeatureSet")

我得到了错误

Error in new("FeatureSet") :
  trying to generate an object from a virtual class ("FeatureSet")

在 NAMESPACE 文件中,我尝试包含“exportClasses”和“exportClassPattern”以从我的包中导出此 S4 定义或所有 S4 定义,但没有成功。我也加入了

exportMethods(coerce, initialize, show)

因为我已经在我的包中为这些泛型定义了方法。

当附加多个具有相同名称的定义时,是否有最佳实践方法来编写 R 代码以仅识别特定的 S4 定义?当然,我可以给我的班级起一个不同的名字,但必须有某种方法来确保我的班级将来不会与其他包中的班级发生冲突。我花了很长时间浏览通常的论坛和文档,并惊讶地发现这个问题在任何地方都没有得到回答。提前致谢!

【问题讨论】:

    标签: r namespaces s4


    【解决方案1】:

    我认为最佳做法是选择一个不同的、更具描述性的名称。拥有两个同名但结构不同的对象本质上是令人困惑的。

    你可以通过

    构造一个“你的”类的实例
    new(getClass("FeatureSet", where=getNamespace("YourPackage")))`
    

    可能包含在一个简单的“构造函数”函数中。

    虽然原则上方法包“知道”你的类的实例和来自另一个包的同名类之间的区别,但你几乎肯定会遇到让你和你的用户感到沮丧的实现错误。

    【讨论】:

    • 非常感谢@Martin-Morgan!我已经开始玩类似于你上面描述的东西,虽然我试图使用envir=as.environment("MyPackage")而不是where=getNameSpace("MyPackage")(没有任何运气!)我决定继续并为所有S4添加一个前缀我的包中的类名(其中许多具有相当通用的名称,如 FeatureSet),这应该可以防止任何未来的冲突。
    • 这不是说所有包都应该为类共享一个通用的全局命名空间吗?使用 aPackage:: 类型前缀使这种事情变得简单的命名空间的全部意义不是吗?这里询问了一个更理论的版本:stackoverflow.com/questions/60726607/…
    • 可能值得确保您的问题在github.com/RConsortium/OOP-WG得到解决
    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 2016-02-06
    • 2020-09-27
    • 2020-06-28
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多