Есть ли способ получить вектор с именем всех функций, которые можно использовать в R? - PullRequest
20 голосов
/ 24 ноября 2010

Я хотел бы получить вызов, который возвращает мне вектор с именами всех функций, которые я мог бы вызвать в текущем R-сеансе. Кто-нибудь знает, как этого добиться?

(Я хотел бы проверить введенные пользователем переменные по этому вектору. У нас возникла непредвиденная проблема с пользователями, вводящими, например, c в качестве имен переменных)

ОБНОВЛЕНИЕ: Я хотел бы получить имена функций из всех загруженных в настоящее время пакетов.

РЕШЕНИЕ (наполовину): На основе подсказки Джорис Мейс с lsf.str() Я придумал следующую функцию, которая возвращает отсортированный вектор со всеми доступными в настоящее время именами функций:

getFunctionNames <- function() {
    loaded <- (.packages())
    loaded <- paste("package:", loaded, sep ="")
    return(sort(unlist(lapply(loaded, lsf.str))))
}

Но, чтобы увидеть лучшие ответы, смотрите также комментарии к сообщению Джорис Мейс.

Ответы [ 2 ]

20 голосов
/ 24 ноября 2010

Я бы использовал lsf.str() в качестве начала.

Например: x <- as.character(lsf.str("package:base")) дает вам список всех функций в базовом пакете.Вы можете добавить все пакеты, которые вы хотите проверить.stats и utils приходят на ум первыми.

РЕДАКТИРОВАТЬ: Относительно вашего вопроса о загруженных в настоящее время пакетов:

x <- unlist (sapply (search () [- 1], функция (x) as.character (lsf.str (x)))) </s> см. комментарии

pkgs <- search()
pkgs <- pkgs[grep("package:",pkgs)]
y <- unlist(sapply(pkgs,lsf.str))

делает свое дело.

7 голосов
/ 24 ноября 2010

Я задал похожий вопрос о 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)
...