【问题标题】:Creating package functions with the same name as existing package创建与现有包同名的包函数
【发布时间】:2019-06-13 10:54:59
【问题描述】:

作为 dplyr 语法的大力支持者,我创建了一个包,该包可用于处理具有相似语法的研究中经常使用的类(summarizedExperiment 或 se)。 (包名清理)。

例如,我定义了一个名为 filter.SummarizedExperiment 的新 filter 函数,它以 se 作为其第一个参数,并将调度函数定义为 filter <- function(se, axis, ...){UseMethod("filter")}

这按预期工作,但加载 cleanse 包后,dplyr 等效函数被屏蔽,过滤数据帧不再起作用。

有什么方法可以调整我的包,以便仍然可以使用 dplyr 的原始数据框版本,并且调度将根据其第一个参数是否为自动使用 dplyr 或清理版本数据框还是 SummarizedExperiment?最好的方法是什么?

PS1:我知道使用显式命名空间的解决方案,即使用 dplyr::filter,但我想要一个基于类自动调度的解决方案。
PS2:dplyr 是 cleanse 的依赖,所以所有用户都会安装 dplyr。

【问题讨论】:

    标签: r dplyr package tidyverse devtools


    【解决方案1】:

    dplyr 已经为filter 定义了一个泛型,所以只需定义您自己的方法。这里我们在se 对象上调用filter 时返回字符串se,因此在filter.se 中适当地替换正文:

    library(dplyr)
    filter.se <- function(x, ...) "se"
    filter.default <- filter.ts <- stats::filter
    

    dplyr 的filter clobbers base R 的过滤器和上面的最后一行是可选的,修复了这个问题,但如果你不使用它,那么无论何时你想使用 base filter,你都必须使用stats::filter

    测试一下:

    filter(BOD, Time < 5)
    filter(1:5, 3)
    filter(structure(1, class = "se"))
    

    【讨论】:

    • 谢谢!我试过你的建议。如果我首先加载 dplyr,则此方法有效,但是当仅加载 cleanse 时,se 的调度失败并且调用 stats::filter 而不是 cleanse::filter。与此一致,我使用过滤器的文档示例在运行包的错误检查时失败。是否有解决方案,以便在仅加载 cleanse 时正确调度过滤器?
    • 问题说明 dplyr 已加载,答案清楚地表明库已运行。 .如果问题是错误的并且 dplyr 没有加载,那么泛型将不存在,您必须自己定义泛型。如果它仍然不起作用,可以尝试将 dplyr 放入 Depends: 和/或定义 filter.data.frame 以调用 dplyr 的版本。
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多