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

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

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

Любая идея, чтобы решить это высоко ценится.

 hadley27 окт. 2012 г., 02:43
Вы также можете найти полезную функцию apropos, если вы помните хотя бы часть названия.

Ответы на вопрос(6)

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

ls()[!sapply(ls(), function(x) is.function(get(x)))]
 Ali26 окт. 2012 г., 23:09
Так что вы можете изменить свой ответ, чтобы он работал?
 BenBarnes26 окт. 2012 г., 23:05
Или в качестве альтернативыls()[!ls()%in%lsf.str()]
 David Robinson26 окт. 2012 г., 23:10
@AliSharifi: вы можете просто использовать (и принять) ответ BenBarnes.
 David Robinson26 окт. 2012 г., 23:06
Нет, это не работаетls() это символьный вектор. Ни один из элементов в нем не вернется, когдаis.function используется. (Пытатьсяf = function() 1; ls()[!sapply(ls(),is.function)] в качестве доказательства).
 Ali26 окт. 2012 г., 23:08
Бен ответ работает на меня

Так что возможно

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

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

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

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

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

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

 Josh O'Brien26 окт. 2012 г., 23:10
Или (тоже самое)setdiff(ls(), lsf.str())
 BenBarnes27 окт. 2012 г., 14:21
@AliSharifi, как упоминал Джош, его комментарий делает то же самое, что и мой ответ. Это просто упаковано по-другому и делает некоторые дополнительные вещи, которые в этом случае не кажутся необходимыми. Тем не менее, так какsetdiff более читабелен, теперь он включен в ответ в качестве альтернативы.
 BenBarnes26 окт. 2012 г., 23:11
@ ДжошО'Брайен, это лучше.
 Ali27 окт. 2012 г., 13:05
Так что это хорошо, чтобы обновить ответ на основе комментария Джоша
 Brandon Bertelsen26 окт. 2012 г., 23:46
Является ли setdiff (x, y) тем же, что и "что в x, а не в y"?

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

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

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

 Ali26 окт. 2012 г., 23:37
Хорошая идея! Другой взгляд
 Gavin Simpson26 окт. 2012 г., 23:37
+1 Или используйтеsys.source() источник.R файлы непосредственно в новую среду и прикрепить его к пути поиска. У меня есть пример этого вдругой ответ с сегодняшнего дня.

Я держу эту функцию в моем.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))
}
 Maiasaura26 окт. 2012 г., 23:37
Пробовал повторить это несколькими способами, но не смог. : /
 Ali26 окт. 2012 г., 23:29
> lsa () Ошибка в data.frame (M = "dgCMatrix", a = "matrix", accFile = "function",: аргументы предполагают различное количество строк: 1, 2. Есть идеи?
 Gavin Simpson27 окт. 2012 г., 00:12
Что произойдет, если объект имеет несколько классов? Не будет ли это причинойobj_type вернуть векторы разной длины? Если это так, сбросивdata.frame() позвонить и использоватьlapply() покинул быlis как список, который был бы устойчив к этому. Или объединить результатclass(get(x)) в строку:paste(class(get(x)), sep = ", ") например.
 Ali26 окт. 2012 г., 23:39
Но .rprofile был интересным. Может быть, лучше поделиться всеми этими инструментами в .rprofiles с другими людьми
Решение Вопроса

чтобы функция делала это, вам нужно немного поиграться с окружением, которое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() когда мы проверяем, являются ли они функцией или нет.

 Ali26 окт. 2012 г., 23:15
Большой! Как всегда :)

Следующая функция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

Ваш ответ на вопрос