Есть ли способ получить вектор с именем всех функций, которые можно использовать в R?
Я хотел бы получить вызов, который возвращает мне вектор с именами всех функций, которые я мог бы вызвать в текущем сеансе R. Кто-нибудь знает, как достичь этого?
(Я хотел бы проверить введенные пользователем переменные против этого вектора. У нас была непредвиденная проблема с входом пользователей, например, c
в качестве имен переменных)
UPDATE: Я хотел бы получить имена функций из всех загруженных пакетов.
РЕШЕНИЕ (на полпути): На основе подсказки Joris Meys с lsf.str()
появилась следующая функция, которая возвращает отсортированный вектор со всеми доступными именами функций:
getFunctionNames <- function() {
loaded <- (.packages())
loaded <- paste("package:", loaded, sep ="")
return(sort(unlist(lapply(loaded, lsf.str))))
}
Бу, см. также комментарии к записи Джориса Мейса для получения более качественных ответов.
Ответы
Ответ 1
Я бы использовал lsf.str()
как начало.
например: x <- as.character(lsf.str("package:base"))
предоставляет вам список всех функций базового пакета. Вы можете добавить все пакеты, которые хотите проверить. stats
и utils
приходят на ум сначала.
EDIT: Что касается вашего вопроса о загруженных в настоящее время пакетах:
x < - unlist (sapply (search() [- 1], function (x) as.character(lsf.str(x)))) см. комментарии
pkgs <- search()
pkgs <- pkgs[grep("package:",pkgs)]
y <- unlist(sapply(pkgs,lsf.str))
делает трюк.
Ответ 2
Я попросил аналогичный Q в R-Help много лет назад (2007), и профессор Брайан Рипли предоставил это как решение:
findfuns <- function(x) {
if(require(x, character.only=TRUE)) {
env <- paste("package", x, sep=":")
nm <- ls(env, all=TRUE)
nm[unlist(lapply(nm, function(n) exists(n, where=env,
mode="function",
inherits=FALSE)))]
} else character(0)
}
pkgs <- dir(.Library)
z <- lapply(pkgs, findfuns)
names(z) <- pkgs
Z <- sort(unique(unlist(z)))
Что дает вывод, например:
> head(Z)
[1] "^" "-" "-.Date" "-.POSIXt" ":" "::"
Это было для поиска всех функций в пакетах, указанных объектом pkgs
, чтобы вы могли контролировать, какие пакеты загружаются/проверяются.
Измененная версия, работающая с загруженным в настоящий момент пакетом пакетов, будет следующей:
findfuns2 <- function(pkgs) {
nm <- ls(pkgs, all = TRUE)
nm[unlist(lapply(nm, function(n) exists(n, where = pkgs,
mode = "function",
inherits = FALSE)))]
if(isTRUE(all.equal(length(nm), 0)))
character(0)
else
nm
}
pkgs <- search()
pkgs <- pkgs[grep("package:", pkgs)]
z <- lapply(pkgs, findfuns2)
z <- sort(unique(unlist(z)))
head(z)