[R] chaining closure arguments on-the-fly

Benjamin Tyner btyner @end|ng |rom gm@||@com
Sun Jun 21 00:19:24 CEST 2020


On 6/20/20 5:49 PM, Bert Gunter wrote:
> Gents:
> (with trepidation)
>
> f(x = 3, y = g(expr))
> **already** evaluates g in the environment of f, **not** in the 
> environment of the caller.
> (This does not contradict Duncan's example -- 3 is a constant, not a 
> variable).
>
> e.g.
> > f <- function(x = 3, y = x^2 +k){
> +     k <- 3
> +     x + y
> + }
>
> Ergo
> > k <- 100; x <- 10
> > f()
> [1] 15
> > f(0)
> [1] 3
> > x
> [1] 10
>
> This is all due to lazy evaluation where default arguments are 
> evaluated in the function's environment (using standard evaluation). 
> Arguments supplied in the call are evaluated in the caller's 
> environment, so:
>
> > f(x = x)
> [1] 113
>
> Am I missing something here?
>
> Cheers,
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming along 
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
Default arguments are indeed evaluated in f's environment, but not 
supplied arguments. I haven't really thought about the semantics of 'g' 
with respect to default arguments. But certainly, lazy evaluation is key 
here.

Ben (with trepidation as well)



More information about the R-help mailing list