Как вы определяете пространство имен функции? - PullRequest
33 голосов
/ 21 июня 2011

Учитывая функцию, как вы определяете, из какого пространства имен она взята?

Например, если я наберу mean.default в командной строке, вывод будет включать тот факт, что он находится в базовом пакете. Я хочу иметь возможность сделать что-то вроде getNamespace(mean.default) и вернуть "base" (или реальную базовую среду).

Существует функция getNamespace, но, похоже, она принимает только имена пакетов, а не имена функций.

print.function использует внутренний код для извлечения пространства имен. Я дошел до просмотра do_printfunction в src/main/print.c, но потом сдался.

Ответы [ 4 ]

34 голосов
/ 21 июня 2011

Я совсем недавно узнал о find(), который, кажется, делает именно это.

R> find("ls")
[1] "package:base"
R> find("na.locf")
[1] "package:zoo"
14 голосов
/ 21 июня 2011

findFunction - это еще один вариант, и ?findFunction говорит, что вы должны использовать его вместо find с mode="function". Результатом findFunction является список окружений, в которых находятся видимые версии функции.

12 голосов
/ 22 июня 2011

Вы хотите getNamespaceName + environment:

getNamespaceName(environment(mean.default))
# [1] "base"
1 голос
/ 07 января 2016

Эта функция ищет функции в загруженных пространствах имен и глобальной среде:

getEnvName <- function(f) {
    attached <- c(environmentName(.GlobalEnv), loadedNamespaces())
    envs <- c(.GlobalEnv, lapply(attached[-1], .getNamespace))
    attached[vapply(envs, function(env) exists(f, env, inherits = FALSE), logical(1))]
}
median <- function() {}
getEnvName("median")
#> [1] "R_GlobalEnv" "stats"
getEnvName(".try_quietly")
#> [1] "tools"
getEnvName("getEnvName")
#> [1] "R_GlobalEnv"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...