2010-11-24 2 views
14

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

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

UPDATE: Я хотел бы получить имена функций из всех пакеты, загруженные в настоящий момент.

РАСТВОР (половина пути): основы Джорис Meys наконечника с lsf.str() я придумал следующую функцию, которая возвращает отсортированный вектор со всеми доступными в настоящее время имен функций:

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

Bu, т смотри также комментарии к записи Джориса Мейса для получения более качественных ответов.

+0

Re вашего обновления, я добавил модифицированную версию findfuns(), что делает именно это. – 2010-11-24 14:39:41

+1

Вы можете просто загрузить <- search() [- 1], а затем вы можете избежать функции вставки. Не забудьте проверить, дает ли ваш результат хорошо сформированный вектор. В моей версии R мне пришлось вложить as.character в приложение, чтобы получить чистый список имен функций, а не много искаженного текста с именами функций, скрытыми где-то там. См. Также мое редактирование. – 2010-11-24 15:06:17

ответ

15

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

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

EDIT: Что касается вашего вопроса о загруженных пакетах:

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

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

делает трюк.

+0

У меня создалось впечатление, что часть `as.character` не нужна. Итак: `y <- unlist (sapply (search() [- 1], lsf.str))` также делает трюк. – Henrik 2010-11-24 15:05:35

6

Я задавал подобный 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) 
Смежные вопросы