Когда вы хотите настроить новые среды в R
за обсуждение стилей программирования R, я видел, как кто-то однажды сказал, что он помещает всю свою пользовательскую функцию в новую среду и присоединяет ее. Я также помню, что среда R может использоваться как хеш-таблица. Это хороший стиль? Когда вы хотите поместить свои данные/функции в новое окружение? Или просто использовать .GlobalEnv?
EDIT верните вторую часть вопроса:
как проверять одну и ту же переменную имени для разных сред?
Ответы
Ответ 1
Мартин Мэчлер предполагает, что это один раз, когда вы, возможно, захотите рассмотреть 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
Ответ 2
Если ваша экосистема данных и кода стала настолько большой, что вы планируете изолировать ее в среде, вам лучше создать пакет. Пакет дает вам больше поддержки:
-
Управление проектом, который становится все большим и сложным, отделяя код и данные от файлов, поэтому есть меньше возможностей для прокрутки за один раз.
-
Пакет упрощает передачу вашей работы кому-то другому, поэтому они могут использовать ваш код и данные.
-
Пакет предоставляет дополнительную поддержку документации и отчетов.
Настройка пакета для R настолько проста, просто вызовите package.skeleton()
, что каждый проект, над которым я работаю, получает свой код и данные, хранящиеся в пакете.
Единственное время, когда я использую среду, - это когда мне нужно изолировать запуск некоторого кода, обычно script, написанного кем-то другим, так что его побочные эффекты и имена переменных не пересекаются с моими. Я делаю это с помощью evalq(source('someScript.R', local=TRUE), SomeEnvironment)
.
Ответ 3
Чтобы ответить на второй вопрос (который вы сейчас удалили), используйте ls.str
или просто получите доступ к объекту в среде с помощью $
:
.myEnv <- new.env()
.myEnv$a <- 2
a <- 1
str(a)
ls.str(.myEnv, a)
str(.myEnv$a)