Нахождение пакета неэкспортированным методом - PullRequest
1 голос
/ 24 сентября 2019

Ситуация, которая часто возникает в SO, это пакеты с перезаписанными функциями, вызывающими непредвиденные ошибки в пакетах, которые зависят от определенных определений функций (например, MASS::negative.binomial и GLMMadaptive::negative.binomial имеют разные аргументы, что приводит к сбою некоторых зависимых пакетов),

Если функция коллизии экспортируется из пакета, исправление, не требующее закрытия и открытия R, часто можно получить как

pck <- find("negative.binomial")
if(length(pck) > 0){
   suppressWarnings(sapply(unlist(pck), function(x) 
                           detach(x, unload = TRUE, 
                                  force = TRUE, character.only = TRUE))
}
if(length(find("negative.binomial")) == 0)
   cat("Succes!\n")

(кредит на популярный вопрос здесь , для идеи.)

Но в случае, если функция или метод функции не экспортируются, например.lme4:::influence.merMod и car:::influence.merMod, find не найдут функцию

>library(lme4)
>library(car)
>find("influence.merMod")
character(0)

Если задан только метод функции в виде строки, как один find пакет attached, который включает в себяконкретная неэкспортируемая функция или метод?

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

getAnywhere найдет все вхождения, а затем мы сможем извлечь имена из возвращаемой структуры.

unique(sub(".*[ :]", "", getAnywhere("influence.merMod")$where)  
## [1] "lme4" "car" 
2 голосов
/ 24 сентября 2019
library(lme4)
library(car)

fun <- "influence.merMod"
p <- loadedNamespaces()
p[vapply(p, function(p) fun %in% ls(envir = asNamespace(p)), FUN.VALUE = FALSE)]
#[1] "car"  "lme4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...