Обе функции ::
и methods()
используют нестандартную оценку для работы. Это означает, что вам нужно быть немного умнее с передачей значений в функции, чтобы заставить его работать. Вот один из методов
f1 <- function(x,y){
do.call("methods", list(substitute(x::y)))
}
f1(broom,tidy)
Здесь мы используем substitute()
для расширения и значения x
и y
, которые мы передаем в поиск пространства имен. Это решает часть ::
, которую вы можете увидеть с помощью
f2 <- function(x,y){
substitute(x::y)
}
f2(broom,tidy)
# broom::tidy
Нам нужна замена, потому что вполне может быть пакет x
с функцией y
. По этой причине переменные не раскрываются при использовании ::
. Обратите внимание, что ::
- это просто оболочка для getExportedValue()
, если в противном случае вам понадобится извлекать значения из пространств имен с использованием символьных значений.
Но есть еще один улов: methods()
не оценивает свои параметры, этоиспользует необработанное выражение для поиска методов. Это означает, что нам на самом деле не нужно значение broom::tidy
, мы должны передать это буквальное выражение. Так как нам нужно вычислить замену, чтобы получить выражение, которое нам нужно, нам нужно построить вызов с do.call()
, чтобы оценить substitute
и передать это выражение на methods()