While I agree with Harlan's overall advice (i.e. don't use something unless you understand it), I would add:
Environments are a fundamental concept in R, and in my view, extremely useful (in other words: they're worth understanding!). Environments are very important to understand issues related to scope. Some basic things that you should understand in this context:
search()
: will show you the workspace; environments are listed in order of priority. The main environment is .GlobalEnv, and can always be referenced as such.
ls()
: will show you what's contained in an environment
attach
/detach
: creates a new environment for an object
get
, assign
, <<-
, and <-
: you should know the difference between these functions
with
: one method for working with an environment without attaching it.
Another pointer: have a look at the proto package (used in ggplot), which uses environments to provide controlled inheritance.
Lastly, I would point out that environments are very similar to lists: they can both store any kind of object within them (see this question). But depending on your use case (e.g. do you want to deal with inheritance and priority), a list can be easier to work with. And you can always attach
a list as an environment.
Edit: If you want to see an example of proto
at work in ggplot
, have a look that the structure of a ggplot object, which is essentially a list composed partially of environments:
> 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
Notice how it's constructed using proto and is containing many environments as a result. You can also plot the relationships in these objects using graph.proto
.