[英]Remove (or exclude) one function from imported package
有沒有辦法從導入的包中排除函數。 例如,我幾乎使用了所有dplyr
但最近,他們添加了一個名為recode
的新函數,該函數覆蓋了我從專有包(我無法對其進行更改)中擁有的函數。
有沒有辦法從命名空間中排除 s3 函數,以便它只能看到我的包中的函數而忽略dplyr
。
我知道我們可以輕松地從包中導入一次性函數,但在這種情況下,我希望排除 - 只有一個。
另一種選擇是使用
recode <- SILLY_PROPRIETARY_PACKAGENAME::recode
在代碼的開頭(帶有解釋性注釋)在全局工作區中創建recode
的副本(然后應該從dplyr
屏蔽版本)。 當您將代碼交給安裝了股票dplyr
而不是您個人破解的版本的人時,這可以防止將來混淆。
R 3.3.0 或更高版本現在支持“從 foo 導入除 x、y、z 之外的所有內容”語句:
\\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.
我認為這正是您在這里想要的,並且希望大多數人想要誰不打算讓 dplyr 破壞 R 附帶的 stats 包中的函數,例如filter
或lag
。
根據后來在評論中的討論進行編輯:
根據 WRE 第 1.5.1 節的文件NAMESPACE
示例用法示例如下:
import(dplyr, except = c(recode, lag, filter))
使用dplyr
的 Hack-R 版本而不是 Hadley 版本。 鑒於我在過去 2 分鍾內創建了這個,您也可以輕松制作自己的版本。
require(devtools)
install_github("hack-r/dplyr")
require(dplyr)
我所做的只是 fork 它,通過版本控制在 RStudio 中打開項目,刪除recode
,提交,然后將其推送回我的 GitHub。
看起來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 用於上述 reprex)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.