Есть ли способ получить вектор с именами всех функций, которые можно было бы использовать в R?

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

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

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

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

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

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


person Henrik    schedule 24.11.2010    source источник
comment
Что касается вашего обновления, я добавил модифицированную версию findfuns(), которая делает именно это.   -  person Gavin Simpson    schedule 24.11.2010
comment
Вы можете просто загрузить ‹- search()[-1] , тогда вы избежите функции вставки. Обязательно проверьте, дает ли ваш возврат корректный вектор. В моей версии R мне пришлось вложить as.character в приложение, чтобы получить чистый список имен функций вместо большого количества искаженного текста с именами функций, спрятанными где-то там. См. также мою правку.   -  person Joris Meys    schedule 24.11.2010


Ответы (2)


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

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

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

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))

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

person Joris Meys    schedule 24.11.2010
comment
У меня сложилось впечатление, что часть as.character не нужна. Итак: y <- unlist(sapply(search()[-1],lsf.str)) тоже помогает. - person Henrik; 24.11.2010
comment
@Joris: Имейте в виду, что на пути поиска могут быть другие вещи (прикрепленные объекты [тьфу!]), возможно, среды (?)) поэтому, возможно, лучше просто использовать те, в которых есть "package:". - person Gavin Simpson; 24.11.2010
comment
@Гэвин: Спасибо! Я был слишком быстр. Следовательно, grep в вашем решении. К счастью, lsf.str перечисляет только функции, так что это не должно вызывать особых проблем. - person Joris Meys; 24.11.2010
comment
или все в одну строку: unlist(lapply(grep("package:",search(),value=TRUE),lsf.str)). Однако при этом вы не выполняете поиск в глобальной среде. Итак, я буду придерживаться версии search()[-1]. - person Henrik; 24.11.2010
comment
@Henrik: если вы хотите искать в глобальной среде, просто используйте search(). search()[-1] это все, кроме глобальной среды - person Joris Meys; 25.11.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)
person Gavin Simpson    schedule 24.11.2010
comment
@Joris - Ничего, кроме того, что я не знал, что он существует :-) - person Gavin Simpson; 24.11.2010
comment
@Joris: Просто посмотрите на ls.str - он в основном делает то, что делают findfuns() Брайана и моя модифицированная версия. Кажется, в 2007 году его не было. - person Gavin Simpson; 24.11.2010
comment
@Гэвин: я понял. Извините, если я был резким, мне просто интересно, почему вы не использовали его, поскольку вы все еще намного впереди меня в R-опыте. - person Joris Meys; 24.11.2010
comment
@Joris - старая школа :-) (и ты совсем не был резким.) Я кое-что узнал из твоего ответа. Приятно, как R развивается таким образом; lsf.str() настолько похож на код Брайана, что эта функция была добавлена ​​в R после обсуждения моего поста в R-Help и других работ по подсветке синтаксиса и других вещей, работающих для R. - person Gavin Simpson; 24.11.2010
comment
@Gavin: Забавно, lsf.str() упоминается в списке рассылки еще в 2003 году, поэтому профессор Рипли меня озадачил... - person Joris Meys; 24.11.2010
comment
@Gavin: Еще более забавно, что это был проф. Сам Рипли, который дал ответ lsf.str() в этом письме: mail-archive.com/[email protected]/msg03618.html - person Joris Meys; 24.11.2010
comment
@Joris - Итак, Брайан, должно быть, использовал код lsf.str() в своем примере - мой первоначальный вопрос касался получения всех функций во всех указанных пакетах, поэтому ему нужно было загрузить пакеты, которые вы хотели найти. Спасибо, что порылся в архивах, Йорис! - person Gavin Simpson; 24.11.2010