簡體   English   中英

從導入的包中刪除(或排除)一個函數

[英]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 包中的函數,例如filterlag

根據后來在評論中的討論進行編輯

根據 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 版中以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 用於上述 reprex)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM