[R] Evaluation of defaults in functions

Marc Schwartz (via MN) mschwartz at mn.rr.com
Thu Sep 28 22:11:05 CEST 2006


On Thu, 2006-09-28 at 21:49 +0200, Ulrich Keller wrote:
> Hello,
> 
> and sorry if this is already explained somewhere. I couldn't find anything.
> 
> R (2.3.1, Windows) seems to perform some kind of lazy evaluation when 
> evaluating defaults in function calls that, at least for me, leads to 
> unexpected results. Consider the following, seemingly equivalent functions:
> 
>  > foo1 <- function(x, y=x) {
> +   x <- 0
> +   y
> + }
>  > foo1(1)
> [1] 0
>  > foo2 <- function(x, y=x) {
> +   y <- y
> +   x <- 0
> +   y
> + }
>  > foo2(1)
> [1] 1
> 
> Obviously, y is not evaluated until it is used in some way. I would 
> expect it to be evaluated where it is defined. Is this intended behavior?
> Thanks for clarifying,
> 
> Uli

Yep. This is documented in the R Language Definition Manual, which is
available via the GUI in the Windows version and/or online here:

  http://cran.r-project.org/doc/manuals/R-lang.html

Specifically in section 4.3.3 Argument Evaluation:

"R has a form of lazy evaluation of function arguments. Arguments are
not evaluated until needed. It is important to realize that in some
cases the argument will never be evaluated. Thus, it is bad style to use
arguments to functions to cause side-effects. While in C it is common to
use the form, foo(x = y) to invoke foo with the value of y and
simultaneously to assign the value of y to x this same style should not
be used in R. There is no guarantee that the argument will ever be
evaluated and hence the assignment may not take place."

You might also want to read section 2.1.8 Promise objects and section
6.2 Substitutions.

HTH,

Marc Schwartz



More information about the R-help mailing list