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

В каких случаях new.env следует использовать для создания новой среды?

В разделе "Какой самый полезный трюк?" (здесь), я прочитал, что использование сред дает "возможности передачи по ссылке". Существуют ли какие-либо ограничения и/или getchas с таким подходом?

Кроме того, в общем, каковы плюсы и минусы использования созданных сред? Это то, о чем я уже давно смутился, поэтому любая ясность или ссылка мне очень помогли.

Спасибо заранее.

4b9b3361

Ответ 1

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

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

  • search(): покажет вам рабочее пространство; среды перечислены в порядке приоритета. Основной средой является .GlobalEnv и всегда можно ссылаться как таковой.
  • ls(): покажет вам, что содержится в среде
  • attach/detach: создает новую среду для объекта
  • get, assign, <<- и <-: вы должны знать разницу между этими функциями
  • with: один метод работы с окружением без его присоединения.

Другой указатель: посмотрите пакет proto (используемый в ggplot), который использует среды для обеспечивают контролируемое наследование.

Наконец, я хотел бы указать, что среда очень похожа на списки: они могут хранить в себе любой объект (см. этот вопрос). Но в зависимости от вашего варианта использования (например, вы хотите иметь дело с наследованием и приоритетом), список может быть проще работать. И всегда можно attach список в качестве среды.

Изменить: если вы хотите увидеть пример proto при работе в ggplot, посмотрите, что структура объекта ggplot, которая по существу представляет собой список, состоящий из части среды:

> p <- qplot(1:10, 1:10)
> str(p)
List of 8
 $ data       :'data.frame':    0 obs. of  0 variables
 $ layers     :List of 1
  ..$ :proto object 
 .. .. $ legend     : logi NA 
 .. .. $ inherit.aes: logi TRUE 
...
> class(p$layers[[1]])
[1] "proto"       "environment"
> is.environment(p$layers[[1]])
[1] TRUE

Обратите внимание, как он создан с использованием proto и в результате содержит множество сред. Вы также можете построить отношения в этих объектах с помощью graph.proto.

Ответ 2

Хорошо, если вы их не понимаете, и люди, которых вы когда-нибудь должны будете прочитать ваш код (включая ваше будущее), не понимают среды, тогда вы не должны их использовать! Они были разработаны для использования для инкапсуляции пространств имен в пакетах и ​​т.д. Тот факт, что вы можете использовать их для передачи по ссылке и хеш-таблицах, не обязательно означает, что вы должны. Это трюк. Как правило, использование глубокой магии на самом деле не рекомендуется, даже если это делает ваш код немного быстрее.