Re: [R] Evaluation of defaults in functions

From: Duncan Murdoch <>
Date: Fri 29 Sep 2006 - 14:50:51 GMT

On 9/29/2006 10:12 AM, hadley wickham wrote:

>> > But doesn't R has a rather limited force of lazy evaluation? - you
>> > have no control over it, apart from that arguments are evaluated
>> > lazily.  This rather limited compared to other languages (no lazy
>> > lists etc)
>> You do have more control than that.  You can't put a promise in a list,
>> but you can put one in an environment, e.g.
>>  > x <- new.env()
>>  > y <- 1
>>  > delayedAssign("z", y, assign=x)
>>  > y <- 2
>>  > x$z
>> [1] 2
> That's interesting.  Is it possible to treat an environment like a
> list in most situations?

There are some important differences:

Lists are regular R objects, which are copied when passed as args to functions. Environments are passed by reference.

Lists have an ordering, and don't need names. Environments only contain named things, and the order in which objects were put into them is not retained.

Lists do partial matching on named args, environments need full matching. For example:

> x <- list(abc=1)
> x$a

[1] 1
> y <- new.env()
> y$abc <- 1
> y$a
> y$abc

[1] 1

Environments have enclosing environments, lists don't. The $ operator doesn't search the enclosure, but get() does:

> y$mean

> get("mean", y)

function (x, ...)
<environment: namespace:base>

Set the parent of the environment to emptyenv() if you don't want this.   By default it's set to the current evaluation environment.

> z <- new.env(parent=emptyenv())
> get("mean", z)

Error in get(x, envir, mode, inherits) : variable "mean" was not found

Duncan Murdoch mailing list PLEASE do read the posting guide and provide commented, minimal, self-contained, reproducible code. Received on Sat Sep 30 00:58:16 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Fri 29 Sep 2006 - 15:30:06 GMT.

Mailing list information is available at Please read the posting guide before posting to the list.