From Kurt.Hornik@ci.tuwien.ac.at  Tue Apr 22 17:33:36 1997
From: Kurt.Hornik@ci.tuwien.ac.at (Kurt Hornik)
Date: Tue, 22 Apr 1997 18:33:36 +0200
Subject: R-alpha: lazy evaluation and plot.step()
In-Reply-To: <x2u3kz9jc9.fsf@bush.kubism.ku.dk>
References: <199704221350.PAA01188@aragorn.ci.tuwien.ac.at>
 <x2u3kz9jc9.fsf@bush.kubism.ku.dk>
Message-ID: <199704221633.SAA01423@aragorn.ci.tuwien.ac.at>

>>>>> Peter Dalgaard BSA writes:

> The explanation seems to be in different behaviour of the
> substitute(...) construction:

> R:
>> f<-function(a,b){a<-1; print(deparse(substitute(c(a,b))))}
>> f(a,b)
> [1] "c(1, b)"

> Splus:
>> f<-function(a,b){a<-1; print(deparse(substitute(c(a,b))))}
>> f(a,b)
> [1] "c(a, b)"
> [1] "c(a, b)"

> So in R, assignment to a formal parameter causes the changed value to
> be used for substitution purposes.

> In S, this does not happen *unless the formal parameter is a
> constant.*!

>> f(2,b)
> [1] "c(1, b)"
> [1] "c(1, b)"
>> f(2:2,b)
> [1] "c(2:2, b)"
> [1] "c(2:2, b)"
>> f("a",b)    
> [1] "c(1, b)"
> [1] "c(1, b)"

> This is confusing in both languages, but I'd say that S has the bigger
> problem...

Not a surprise ...

Thanks, Peter, for the explanation.  Does this also explain the
different results for x <- sort(x)?

> In Kurts example, inserting 

> xlab 
> ylab

> as the first two lines of the function defeats lazy evaluation and
> provides the desired behaviour (I suppose) in both R and S.

Yes.  This is also what I suggested to Martin in order to have a version
of plot.step() which does the same under R and S.

-k
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


R-alpha: lazy evaluation and plot.step()
Kurt Hornik