Подтвердить что ты не робот

Когда вы хотите настроить новые среды в R

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

EDIT верните вторую часть вопроса: как проверять одну и ту же переменную имени для разных сред?

4b9b3361

Ответ 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)