[R] Strange lazy evaluation of default arguments

Matthias Gondan matthias-gondan at gmx.de
Tue Sep 5 16:49:21 CEST 2017


Dear S Ellison,

Thanks for the flowers! Indeed, I was actually considering to use it in my own teaching material, as well. With rounded numbers, of course.

Though I am still slightly disturbed about this feature. I thought, now it is the time to switch to Python, but that’s even worse, see here:

def add_elem(List=[]):
    List.append('elem')
    return List

>>> add_elem([2])
[2, 'elem']
>>> add_elem()
['elem']
>>> add_elem()
['elem', 'elem'] <<<<<<<<<<< why on earth does this happen? [it’s documented behavior, but still…]

So, I’ll stick with R. Still 25 years or so until retirement, but I’ll survive, even without crossreferenced default arguments.

Best wishes,

Matthias


Von: S Ellison
Gesendet: Dienstag, 5. September 2017 16:17
An: Matthias Gondan; r-help at r-project.org
Betreff: RE: [R] Strange lazy evaluation of default arguments

Mathias,
If it's any comfort, I appreciated the example; 'expected' behaviour maybe, but a very nice example for staff/student training!

S Ellison


> -----Original Message-----
> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Matthias
> Gondan
> Sent: 02 September 2017 18:22
> To: r-help at r-project.org
> Subject: [R] Strange lazy evaluation of default arguments
> 
> Dear R developers,
> 
> sessionInfo() below
> 
> Please have a look at the following two versions of the same function:
> 
> 1. Intended behavior:
> 
> > Su1 = function(u=100, l=u, mu=0.53, sigma2=4.3^2)
> + {
> +   print(c(u, l, mu)) # here, l is set to u’s value
> +   u = u/sqrt(sigma2)
> +   l = l/sqrt(sigma2)
> +   mu = mu/sqrt(sigma2)
> +   print(c(u, l, mu))
> + }
> >
> > Su1()
> [1] 100.00 100.00   0.53
> [1] 23.2558140 23.2558140  0.1232558
> 
> In the first version, both u and l are correctly divided by 4.3.
> 
> 2. Strange behavior:
> 
> > Su2 = function(u=100, l=u, mu=0.53, sigma2=4.3^2)
> + {
> +   # print(c(u, l, mu))
> +   u = u/sqrt(sigma2)
> +   l = l/sqrt(sigma2) # here, l is set to u’s value
> +   mu = mu/sqrt(sigma2)
> +   print(c(u, l, mu))
> + }
> >
> > Su2()
> [1] 23.2558140  5.4083288  0.1232558
> In the second version, the print function is commented out, so the variable u
> is copied to l (lowercase L) at a later place, and L is divided twice by 4.3.
> 
> Is this behavior intended? It seems strange that the result depends on a
> debugging message.
> 
> Best wishes,
> 
> Matthias
> 
> 
> > sessionInfo()
> R version 3.4.1 (2017-06-30)
> Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8
> x64 (build 9200)
> 
> Matrix products: default
> 
> locale:
> [1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252
> LC_MONETARY=German_Germany.1252
> [4] LC_NUMERIC=C                    LC_TIME=German_Germany.1252
> 
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
> 
> loaded via a namespace (and not attached):
> [1] compiler_3.4.1 tools_3.4.1
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.


*******************************************************************
This email and any attachments are confidential. Any use...{{dropped:12}}



More information about the R-help mailing list