Скрытие имен функций из результатов ls() - быстрее найти имя переменной

Когда мы определили десятки функций - возможно, для разработки нового пакета - трудно определить имя конкретной переменной среди многих имен функций с помощью команды ls().

В большинстве случаев мы не ищем имени функции - мы уже знаем, что они существуют, но мы хотим найти, какое имя мы присвоили переменной.

Любая идея решить эту проблему очень ценится.

Ответ 1

Если вам нужна функция, вам нужно немного поиграть со средой, в которой находится ls(). При нормальном использовании реализация ниже будет работать путем перечисления объектов в родительском фрейме функции, которая будет глобальной средой, если вызывается на верхнем уровне.

lsnofun <- function(name = parent.frame()) {
    obj <- ls(name = name)
    obj[!sapply(obj, function(x) is.function(get(x)))]
}

> ls()
[1] "bar"           "crossvalidate" "df"           
[4] "f1"            "f2"            "foo"          
[7] "lsnofun"       "prod"         
> lsnofun()
[1] "crossvalidate" "df"            "f1"           
[4] "f2"            "foo"           "prod"

Я написал это, чтобы вы могли передать аргумент name ls(), если вам нужно вызвать этот путь вниз в серии вложенных вызовов функций.

Обратите внимание, что мы должны get() объекты, названные ls(), когда мы проверяем, являются ли они функцией или нет.

Ответ 2

Итак, возможно,

ls()[!ls()%in%lsf.str()]

Предложение Джоша О'Брайена заключалось в использовании

setdiff(ls(), lsf.str())

Эта функция после некоторых преобразований и проверок вызывает

x[match(x, y, 0L) == 0L]

который довольно близок к тому, что я предложил в первую очередь, но хорошо упакован в функции setdiff.

Ответ 3

Вместо того, чтобы сортировать объекты в вашей глобальной среде и пытаться отделить объекты данных от функций, было бы лучше сохранить функции в другой среде, чтобы ls() не перечислил их (по умолчанию он перечисляет только объекты в глобальная среда). Но они все еще доступны и могут быть перечислены, если это необходимо.

Лучший способ сделать это - сделать пакет с функциями в нем. Это не так сложно, как иногда кажется, просто используйте package.skeleton для запуска.

Другой альтернативой является использование функции save для сохранения всех ваших функций в файле, удаления их из глобальной среды, а затем использования функции attach для присоединения этого файла (и, следовательно, всех функций) к поиску путь.

Ответ 4

Значит, вам просто нужны имена переменных, а не функции? Это сделает это.

ls()[!sapply(ls(), function(x) is.function(get(x)))]

Ответ 5

Следующая функция lsos была ранее размещена в stackoverflow (ссылка) - она ​​дает хороший порядок объектов, загруженных в ваш сеанс R на основе их размера. Вывод функции содержит класс объекта, который впоследствии можно фильтровать для получения не-функциональных объектов.

source("lsos.R")

A <- 1
B <- 1
C <- 1
D <- 1
E <- 1
F <- function(x) print(x)

L <- lsos(n=Inf)
L[L$Type != "function",]

Это возвращает:

> lsos(n=Inf)
         Type Size Rows Columns
lsos function 5184   NA      NA
F    function 1280   NA      NA
A     numeric   48    1      NA
B     numeric   48    1      NA
C     numeric   48    1      NA
D     numeric   48    1      NA
E     numeric   48    1      NA

Или, с фильтром, функция F не возвращается:

> L[L$Type != "function",]
     Type Size Rows Columns
A numeric   48    1      NA
B numeric   48    1      NA
C numeric   48    1      NA
D numeric   48    1      NA
E numeric   48    1      NA

Ответ 6

Я сохраняю эту функцию в своем .rprofile. Я не часто его использую, но это здорово, когда у меня есть несколько сред, функций и объектов в моей глобальной среде. Очевидно, не так изящно, как решение BenBarnes, но я никогда не должен помнить синтаксис и могу просто позвонить lsa() по мере необходимости. Это также позволяет мне перечислять конкретные среды. например lsa(e)

lsa <- function(envir = .GlobalEnv) {
    obj_type <- function(x) {
        class(get(x))
    }
    lis <- data.frame(sapply(ls(envir = envir), obj_type))
    lis$object_name <- rownames(lis)
    names(lis)[1] <- "class"
    names(lis)[2] <- "object"
    return(unrowname(lis))
}