R-alpha: lazy evaluation and plot.step()
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... 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. - Peter ---- Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at> writes:
"test" <-
function(x, y, xlab = deparse(substitute(x)), ylab = deparse(substitute(y)))
{
x <- sort(x)
print(xlab)
n <- length(x)
y <- (1:n) / n
print(ylab)
}
Under R,
R> test(4:1)
[1] "c(1, 2, 3, 4)"
[1] "c(0.25, 0.5, 0.75, 1)"
R> test(4:1, 4)
[1] "c(1, 2, 3, 4)"
[1] "c(0.25, 0.5, 0.75, 1)"
Under S,
test(4:1)
[1] "4:1" [1] "" [1] ""
test(4:1, 4)
[1] "4:1" [1] "c(0.25, 0.5, 0.75, 1)" [1] "c(0.25, 0.5, 0.75, 1)" ???
O__ ---- Peter Dalgaard Blegdamsvej 3 c/ /'_ --- Dept. of Biostatistics 2200 Cph. N (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 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 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-