On 14/03/2010 4:33 PM, Mark Heckmann wrote:
Yes. I meant lazy evaluation :)
I will try to clarify what I mean.
I have a function foo and in its arguments use a reference to another
argument, like:
foo <- function(x=y, y=x)
I would like to specify the function in a way it is possible to change
the way the argument y is evaluated.
e.g.:
foo(x=3, y=2*x) # this won't work
I want the above to be equivalent to
foo <- function(x=y, y=2*x)
But I to not want to respecify foo() but rather pass the a new
function during the call (here 2*x) that will be used to calculate y.
This problem arised in the following situation:
There may be a way to do this, but it would involve very unreadable
contortions. Default values for parameters are evaluated in the context
of the function evaluation (since they are set by the function author,
who knows what's going on there), whereas explicitly specified parameter
values are evaluated in the context of the caller (since they are set by
the caller, who knows what's going on *there*). Subverting this
sensible scheme might be possible, but it isn't sensible.
If you want to take over authorship of the function, you can change it,
and then things will be evaluated where you say. For example, if you're
given foo as above, you can create myfoo as follows:
myfoo <- foo
formals(myfoo)$y <- quote(2*x)
foo <- function(x=background, y=checkcolor(background))
Here a background color is given and checkcolor() will return a color
for the text that gives a good contrast to the background color.
Now, I would like to change the function used for this step, like:
foo <- function(x=background, y=checkcolorNew(background))
but to do this within the call: The solution is use know is the
following:
foo <- function(x=y, y=fun(x), fun=function(x) x*2) cat (x,y)
foo(2)
and with modified funtion to calculate y:
foo(2, , fun=function(x) 20*x)
So I use the extra argument fun. Before I tried to do it without the
extra argument, though I still do not know if it is possible.
If it is basically was my question if it is.
I think you'll get what you want with
foo <- function(x=background, y=checkcolor(background)) { ... }
myfoo <- foo
formals(myfoo)$y <- quote(checkcolorNew(background))
Duncan Murdoch
______________________________________________
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.