2014-02-12 2 views
1

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

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

Но выше ничего не делает после того, как я не источник кода и запустите команду «CLR()» (без кавычек, конечно).

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

Заранее благодарен!

+0

Возможно, хорошей идеей было бы научиться не сохранять рабочее пространство .Rdata в каталоге R, начинающемся с – mdsumner

+0

. Я всегда меняю каталог на тот, где находится мой R-файл. Это то, что вы говорите, что я должен делать? –

+0

@mdsumner, я ценю другое объяснение для [Очистка рабочего пространства в R] (http://stackoverflow.com/questions/20389821/clearing-workspace-in-r), однако мне нравится, как приведенное ниже решение позволяет избежать удаления функции объекта сам. –

ответ

4

Есть две проблемы с вашей функцией, связанной с средой: оба 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(); функции без аргументов прекрасны.

+0

Я использовал метод '.', назвав функцию в своем ответе здесь: http://stackoverflow.com/a/20389913/1270695 – A5C1D2H2I1M1N2O1R2T1

+0

Большое спасибо, это имеет смысл. В R есть ли загрузочный файл, который запускается при открытии R, поэтому мне не нужно указывать файл, в котором находится эта функция, каждый раз, когда я использую R? –

+0

@ АнандаМахто Я считал, что именовать функцию с помощью '.', чтобы скрыть ее, но затем понял, что она все равно будет очищена, если вы захотите также удалить скрытые объекты. Я не думаю, что есть четкое решение для этого, кроме как для его упаковки и загрузки, как и для любого другого R-пакета, или 'attach()' функция для пути поиска, тогда не имеет значения, рабочее пространство удаляется. –

0

Мое мнение, что это неправильный вопрос. Конструкция 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/имя пользователя/Documents".)

Right-click on Properties

enter image description here

  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 самостоятельно, установив View Properties для папки (это Windows 8, где я получаю ее через «View/Options» Change folder and search options »):

Really, just show me what's actually here

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

В этом поле «Целевое» свойств ярлыка вы можете добавить такие аргументы, как «-no-restore» или «-no-restore-data».

Not ideal, but it's an option

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

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

Rgui --help 

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

+0

Это кажется немного сверху, с охотой и убийством, и все :), но я думаю, что это только потому, что я не сталкиваюсь с описанной проблемой. Я использую 'rm (list = ls())', потому что у меня уже есть сеанс, и я хочу убедиться, что мой скрипт работает сам по себе, без того, что я определял в интерактивном режиме (а не потому, что я дважды нажал кнопку R значок и столкнулся с '.RData'). Я почти запускаю R, дважды щелкнув «name.RData» или используя сеансы nppToR. – Frank

+1

Хорошо, я сохраню его, когда у меня будет цель. – mdsumner

+0

Спасибо mdsumner. Я посмотрю на то, что вы упомянули, чтобы правильно понять, что делает R, когда он запускается. Мне нравится «очищать рабочее пространство» по тем же причинам, что и @Frank. Но, возможно, я столкнусь с проблемами, о которых вы говорите в будущем. Большое спасибо за всю информацию! –

Смежные вопросы