On 28/03/2014, 2:04 AM, Philippe Grosjean wrote:
On 28 Mar 2014, at 00:57, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:

On 27/03/2014, 7:38 PM, Thomas Lumley wrote:
You get what you wanted from

do.call(plot,list(x=quote(x),y=quote(y)))

By the time do.call() gets the arguments it doesn't know how y was
originally computed, just what values it has.

This works, but it doesn't make sense to me.  The arguments end up with the 
expressions x and y, but why are they evaluated in the right place?  Quote 
doesn't bind an environment to its expressions, does it?  How does plot() know 
where to evaluate them?

Duncan Murdoch

I am puzzled here… Isn't it the same when you write plot(x = x, y = y)? You don't tell 
the environment for your 'x' and 'y' expressions, isn't it? And they are defined from the 
context the function call and definition. You do the same with the env= argument of 
do.call() which is equal to parent.frame() by default. As far as I understand, it is 
behaving similarly. I have tried a few "risky" situations:

In that case the environment is the evaluation environment for the plot() call.

I'm in a rush right now, so I haven't analyzed all of these examples, but I have one more comment down below.

1) S3 dispatch:
## do.call() with quote() inside S3 methods
## Trying to be silly by defining x and y inside the generic too to make sure 
do.call() isn't confused
myPlot <- function (x, y, ...) {
     x <- 101:110
     y <- rep(1, 10)
     UseMethod("myPlot")
}

## A method that uses plot() directly
myPlot.anObj1 <- function (x, y, ...)
     plot(x = x, y = y)
x <- structure(1:10, class = "anObj1")
y <- (x - 5.5)^2
myPlot(x = x, y = y) # right

## A method that uses do.call() with quote()
myPlot.anObj2 <- function (x, y, ...)
     do.call(plot, list(x = quote(x), y = quote(y)))
x <- structure(1:10, class = "anObj2")
myPlot(x = x, y = y) # same result

## A dispatch to the default method
myPlot.default <- function (x, y, ...)
     do.call(plot, list(x = quote(x), y = quote(y)))
x <- 1:10
myPlot(x = x, y = y) # same result

This seems to give the same thing.

2) A really crazy and tortuous closure where I try to confuse do.call() with 
lexical scoping and all the stuff:

## This one uses plot() directly
makePlotFun1 <- function () {
     x <- 1:10
     y <- (x - 5.5)^2
     Y <- y
     ## If I use y directly as default value for argument y= in the next 
instruction
     ## I got a "promise already under evaluation" error!
     function (x, y = Y) plot(x = x, y = y)
}

## This one uses do.call(plot, ….)
makePlotFun2 <- function () {
     x <- 1:10
     y <- (x - 5.5)^2
     Y <- y ## Same remark as for makePlotFun1()
     function (x, y = Y) {
         do.call(plot, list(x = quote(x), y = quote(y)))
     }
}

## Different x and y values in .GlobalEnv
x <- 101:110
y <- rep(1, 10)

myPlotFun1 <- makePlotFun1()
myPlotFun1(x = x, y = y)
## and...
myPlotFun1(x = x) # It uses y from the closure. It's fine.

## Now, using do.call()
myPlotFun2 <- makePlotFun2()
myPlotFun2(x = x, y = y)
## and...
myPlotFun2(x = x) # Same result


You are probably right, but I cannot think of a situation where do.call(plot, 
list(x = quote(x), y = quote(y)) do not give the same result as list(x = x, y = 
y). Have you an example?

Rolf's example is one, e.g.

x <- 1:10
y <- x^2
plot(x,y)  # gets nice xlab and ylab

do.call(plot, list(x=x, y=y)) # ugly xlab and ylab

do.call(plot, list(x=quote(x), y=quote(y)) # nice xlab and ylab

Duncan Murdoch

Best,

Philippe





    -thomas


On Thu, Mar 27, 2014 at 6:17 PM, Rolf Turner <r.tur...@auckland.ac.nz>wrote:



I was under the impression that

         do.call(foo,list(x=x,y=y))

should yield the same result as

         foo(x,y).

However if I do

         x <- 1:10
         y <- (x-5.5)^2
         do.call(plot,list(x=x,y=y))

I get the expected plot but with the y-values (surrounded by c()) being
printed (vertically) in the left-hand margin of the plot.

The help for do.call() says:

  The behavior of some functions, such as substitute, will not be the
same for functions evaluated using do.call as if they were evaluated
from the interpreter. The precise semantics are currently undefined and
subject to change.


Am I being bitten by an instance of this phenomenon?  Seems strange.

I would be grateful for enlightenment.

cheers,

Rolf Turner

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/
posting-guide.html
and provide commented, minimal, self-contained, reproducible code.





______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to