Написание функции быстрого доступа в R для rm(list=ls())

Я нахожусь на ранних стадиях изучения R, и подумал, что это будет достаточно простое упражнение. хотел бы написать функцию ярлыка для удаления всех переменных из рабочей области. Я попытался со следующим (тестирование, что это работало, используя оператор печати, первоначально):

clr<-function(x){ 
  rm(list = ls()) 
  #sprintf('this works')
}

Но вышесказанное ничего не делает после того, как я произвожу код и запускаю команду "clr()" (без кавычек, конечно).

Нужно ли указывать среду (env = globalenv())? Я пробовал это, но безрезультатно.

Заранее спасибо!

2 ответа

Решение

Есть две проблемы с вашей функцией, связанные с окружением: оба ls() а также rm() работать в текущей среде, которая будет исполнять фрейм функции clr(),

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

Как только вы это исправите, вам все еще нужно сказать rm() из какой среды удалять объекты. Здесь вы сделали еще одну ошибку; первый аргумент rm() является ...Это означает, что вам нужно полностью назвать аргументы rm() которые идут после ... аргумент. Аргумент, который вы хотите envir не env,

Вот функция, которая делает то, что вы хотели, плюс она не удалит себя (!).

clr <- function() {
  ENV <- globalenv()
  ll <- ls(envir = ENV)
  ll <- ll[ll != "clr"]
  rm(list = ll, envir = ENV)
}

В использовании мы имеем

> ls()
[1] "clr"  "obj1" "obj2"
> clr()
> ls()
[1] "clr"

Обратите внимание, что как написано, это не удалит скрытые объекты (те, с . как первый символ их имени). Для этого вам нужно использовать ls(all.names = TRUE),

Последнее замечание, но вам не нужен аргумент x в определении clr(); функции без аргументов в порядке.

Я считаю, что это неправильный вопрос. rm(list = ls(...))Конструкция - это просто неприятный вирус, распространяющийся по коду, скопированному между пользователями.

Какая потребность в этой конструкции?

  • аккуратное рабочее пространство
  • уменьшить использование памяти
  • упростить сеть зависимостей (rm не поможет это)

Почему дизайнеры R не предоставляют чистое рабочее пространство для начала? Они делают, это просто неправильно используется, и поведение Windows по умолчанию скрывает детали бесполезными способами.

Почему рабочее место не чистое, когда запускается R?

Когда запускается R, он всегда работает с "текущим каталогом", это похоже на "в папке", если вы запрашиваете "file1.iaf", вам не нужно явно указывать на "C:/temp/myfolderofiafs" /file1.iaf".

В Unix это просто место, где вы печатаете

R

и вы можете увидеть это непосредственно при вводе

pwd

В Windows то же самое в командной строке (замените pwd на dir и найдите "Directory of ..."), но когда вы (дважды) нажмете на ярлык R, система сделает то же самое для вас, но где его запуск контролируется "Свойствами" шортута. Вы можете увидеть это, щелкнув правой кнопкой мыши по ярлыку, щелкнув "Свойства" и узнав, что написано в поле "Начать с". (Это может быть системный символ подстановки, такой как%HOMEPATH% или любой другой, но это, вероятно, означает "C:/Users/username/Documents".)

Щелкните правой кнопкой мыши на Свойства

  1. По умолчанию R запускается в одной из ваших папок, потому что это единственное место, где он действительно может знать, что у него есть права на что-либо.

  2. Я использую Windows 8, все это немного отличается в Windows 3.1, 95, 98, NT, CE, 2000, XP, Vista и 7, но охватывает все, что можно оставить в Google.

Загляните в эту папку "Начать с", скорее всего, вы не увидите файл с именем ".Rdata", но это потому, что он скрыт. Запустите R и запустите следующий код, прежде чем делать что-либо еще:

list.files(all = TRUE)

Есть ли файл.Rdata? (Вы можете использовать "dir /a", чтобы увидеть его в командной строке, или "ls -a" в unix для того же.)

При запуске R этот файл загружается по умолчанию, как если бы вы сделали следующее:

load(".Rdata")

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

Вы можете исправить это из R, сделайте это:

unlink(".Rdata")

и когда вы выйдете из R, выберите "нет", чтобы этот скрытый файл больше не создавался заново. Если вы случайно создали его, выследите его и убейте снова.

Если вы действительно хотите сохранить все рабочее пространство, используйте:

save.image("myentireworkspaceorperhapssomesensiblefilenameforit.Rdata")

или только несколько объектов из него:

save(keepme, keepme2, andme, file = "justsomeofmyclingyobjects.Rdata")

Вы можете увидеть скрытый файл ".Rdata" в самой Windows, установив Свойства представления для папки (это Windows 8, куда я попадаю через "Вид / Параметры" Изменить папку и параметры поиска "):

На самом деле, просто покажи мне, что на самом деле здесь

Выберите "Показать скрытые файлы, папки и диски". Я также настоятельно рекомендую вам снять флажок "Скрыть расширения для известных типов файлов", потому что расширение действительно является частью имени файла, и его скрытие иногда просто смущает все. (Windows по умолчанию выдаст реальное имя вашего файла "file.R.txt", если вы попытаетесь переименовать его из "file.txt" в "file.R" без этого набора).

Это еще не все, в поле "Цель" в Свойствах ярлыка вы можете добавить такие аргументы, как "--no-restore" или "--no-restore-data".

Не идеально, но это вариант

Это также "решило бы" основную проблему, описанную выше, но не в правильном смысле, ИМО.

Эти аргументы доступны в командной строке с помощью (в Windows):

Rgui --help

но вам нужно будет использовать полный путь или иметь в папке R каталог bin/*, чтобы это работало. Увидеть ?Startup для более полного обсуждения,

Другие вопросы по тегам