有没有办法从导入的包中排除某个功能。例如,我几乎使用了所有dplyr
,但最近,他们添加了一个名为recode
的新函数,它覆盖了我从专有软件包中获得的函数(我无法对其进行更改)。
有没有办法从命名空间中排除s3函数,所以它只能看到我的包中的函数而忽略dplyr
中的函数。
我知道我们可以轻松地从包中导入一次性函数,但在这种情况下,我想要排除 - 只有一个。
答案 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,例如filter
或lag
。
根据以后在评论中的讨论进行编辑:
每个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 版中以exclude
和 include.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 用于上面的表示)