Подтвердить что ты не робот

Как вы определяете пространство имен функции?

Для функции, как вы определяете, какое пространство имён было получено?

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

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

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

4b9b3361

Ответ 1

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

R> find("ls")
[1] "package:base"
R> find("na.locf")
[1] "package:zoo"

Ответ 2

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

Ответ 3

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

getNamespaceName(environment(mean.default))
# [1] "base"

Ответ 4

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

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"