когда вы хотите создать новую среду в R - PullRequest
18 голосов
/ 10 декабря 2010

за обсуждение стилей программирования R, я видел, как кто-то однажды сказал, что он помещает все свои пользовательские функции в новую среду и присоединяет ее. Я также помню, что среда R может использоваться в качестве хеш-таблицы. Это хороший стиль? Когда вы хотите поместить свои данные / функции в новую среду? Или просто использовать .GlobalEnv как угодно?

РЕДАКТИРОВАТЬ вернуть мою вторую часть вопроса: Как проверить одно и то же имя переменной для разных сред?

Ответы [ 3 ]

11 голосов
/ 10 декабря 2010

Мартин Мехлер предполагает, что это один раз, когда вы, возможно, захотите рассмотреть attach(), хотя он предложил это в контексте присоединения файла .Rdata к пути поиска, но ваш Q по сути то же самое.

Преимущество состоит в том, что вы не загромождаете глобальную среду функциями, которые могут быть случайно перезаписаны и т. Д. Хотя я бы не стал так далеко называть этот плохой стиль, вам лучше было бы придерживаться своих пользовательских функций ваш личный пакет R. Да, это потребует некоторых дополнительных затрат на настройку структуры пакета и предоставление некоторой документации, позволяющей установить пакет, но в долгосрочной перспективе это лучшее решение. С такими инструментами, как roxygen, этот процесс упрощается.

Лично я не нашел необходимости возиться со средами в течение 10 лет использования R; хорошо документированные скрипты, которые загружают, обрабатывают и анализируют данные, постоянно убирая за собой, до сих пор хорошо мне помогали.


Еще одно предложение для второй части вашего вопроса (теперь удалено) заключается в использовании with() (в соответствии с примером @ Joshua):

> .myEnv <- new.env()
> .myEnv$a <- 2
> a <- 1
> str(a)
 num 1
> ls.str(.myEnv, a)
a :  num 2
> str(.myEnv$a)
 num 2
> with(.myEnv, a)
[1] 2
> a
[1] 1
6 голосов
/ 11 декабря 2010

Если ваша экосистема данных и кода выросла настолько, что вы рассматриваете возможность ее изоляции в среде, вам лучше создать пакет.Пакет дает вам гораздо больше поддержки для:

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

  • Пакет упрощает передачу вашей работы кому-либо еще, чтобы он мог использовать ваш код и данные.

  • Пакет обеспечивает дополнительную поддержкудля документации и отчетности.

Настроить пакет для R так просто, просто наберите package.skeleton(), что каждый проект, над которым я работаю, получает свой код и данные, хранящиеся в пакете.

Единственный раз, когда я использую среды, это когда мне нужно изолировать прогон некоторого кода, обычно сценария, написанного кем-то другим, чтобы его побочные эффекты и имена переменных не пересекались с моими.Я делаю это evalq(source('someScript.R', local=TRUE), SomeEnvironment).

4 голосов
/ 10 декабря 2010

Чтобы ответить на второй вопрос (который вы сейчас удалили), используйте ls.str или просто получите доступ к объекту в среде с помощью $:

.myEnv <- new.env()
.myEnv$a <- 2
a <- 1
str(a)
ls.str(.myEnv, a)
str(.myEnv$a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...