Ответ 1
Недавно я узнал о find()
, который, кажется, делает именно это.
R> find("ls")
[1] "package:base"
R> find("na.locf")
[1] "package:zoo"
Для функции, как вы определяете, какое пространство имён было получено?
Например, если я набираю mean.default
в командной строке, вывод включает в себя тот факт, что он находится в базовом пакете. Я хочу иметь возможность сделать что-то вроде getNamespace(mean.default)
и вернуть ему "базу" (или фактическую базовую среду).
Существует функция getNamespace
, но, по-видимому, она принимает только имена пакетов, а не имена функций.
print.function
использует внутренний код для извлечения пространства имен. Я добрался до do_printfunction
в src/main/print.c
, но затем сдался.
Недавно я узнал о find()
, который, кажется, делает именно это.
R> find("ls")
[1] "package:base"
R> find("na.locf")
[1] "package:zoo"
findFunction
- еще один вариант, а ?findFunction
говорит, что вы должны использовать его вместо find
с mode="function"
. Результатом findFunction
является список среды (ов), в которой находятся видимые версии функции.
Вы хотите getNamespaceName
+ environment
:
getNamespaceName(environment(mean.default))
# [1] "base"
Эта функция выполняет поиск функций в загруженных пространствах имен и глобальной среде:
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"