从导入的包中删除(或排除)一个函数

时间:2016-07-10 20:11:13

标签: r

有没有办法从导入的包中排除某个功能。例如,我几乎使用了所有dplyr,但最近,他们添加了一个名为recode的新函数,它覆盖了我从专有软件包中获得的函数(我无法对其进行更改)。

有没有办法从命名空间中排除s3函数,所以它只能看到我的包中的函数而忽略dplyr中的函数。

我知道我们可以轻松地从包中导入一次性函数,但在这种情况下,我想要排除 - 只有一个。

4 个答案:

答案 0 :(得分:10)

另一种选择是使用

recode <- SILLY_PROPRIETARY_PACKAGENAME::recode

在代码的头部(带有解释性注释),在全局工作空间中创建recode的副本(然后应该掩盖dplyr中的版本)。当您将代码交给拥有库存dplyr而非安装个人黑客版本的人时,这可以防止将来出现混淆。

答案 1 :(得分:9)

R 3.3.0或更高版本现在支持"import all but x,y,z from foo" statements

  \item The \code{import()} namespace directive now accepts an
  argument \code{except} which names symbols to exclude from the
  imports. The \code{except} expression should evaluate to a
  character vector (after substituting symbols for strings). See
  Writing R Extensions.

完全符合您的要求,并且希望大多数人都希望谁不打算使用R中包含的统计信息包中的函数dplyr clobber,例如filterlag

根据以后在评论中的讨论进行编辑

每个Section 1.5.1 of WRE文件NAMESPACE中的用法示例如下:

import(dplyr, except = c(recode, lag, filter))

答案 2 :(得分:4)

使用Hack-R版本的dplyr代替Hadley版本。鉴于我在过去2分钟内创建了这个,你也可以轻松制作自己的版本。

require(devtools)
install_github("hack-r/dplyr")
require(dplyr)

我所做的只是分叉,通过版本控制在RStudio中打开项目,删除recode,提交,然后将其推回到我的GitHub。

答案 3 :(得分:1)

看起来 library() 在 3.6 版中以excludeinclude.only 参数的形式获得了此功能。

https://developer.r-project.org/Blog/public/2019/03/19/managing-search-path-conflicts/

library(digest, exclude="sha1")
digest(letters)
#> [1] "5cab7c8e9f3d7042d6146f98602c88d2"
sha1(letters)
#> Error in sha1(letters): could not find function "sha1"

或:

library(digest, include.only="sha1")
digest(letters)
#> Error in digest(letters): could not find function "digest"
sha1(letters)
#> [1] "005ae317c931561a05b53fcfa860d7ac61dfec85"

与没有任何一个选项的情况相比:

library(digest)
digest(letters)
#> [1] "5cab7c8e9f3d7042d6146f98602c88d2"
sha1(letters)
#> [1] "005ae317c931561a05b53fcfa860d7ac61dfec85"

非常整洁!

(R.4.0.3 用于上面的表示)