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:

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?

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