Скрытие имен функций из результатов 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))
}