[R] Strange lazy evaluation of default arguments

William Dunlap wdunlap at tibco.com
Sat Sep 2 19:40:50 CEST 2017


Another way to avoid the problem is to not redefine variables that are
arguments.  E.g.,

> Su3 <- function(u=100, l=u, mu=0.53, sigma2=4.3^2, verbose)
  {
    if (verbose) {
      print(c(u, l, mu))
    }
    uNormalized <- u/sqrt(sigma2)
    lNormalized <- l/sqrt(sigma2)
    muNormalized <- mu/sqrt(sigma2)
    c(uNormalized, lNormalized, muNormalized)
  }
> Su3(verbose=TRUE)
[1] 100.00 100.00   0.53
[1] 23.2558140 23.2558140  0.1232558
> Su3(verbose=FALSE)
[1] 23.2558140 23.2558140  0.1232558

Not redefining variables at all makes debugging easier, although it may
waste space.

Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Sat, Sep 2, 2017 at 10:33 AM, <ruipbarradas at sapo.pt> wrote:

> Hello,
>
> One way of preventing that is to use ?force.
> Just put
>
>    force(l)
>
> right after the commented out print and before you change 'u'.
>
> Hope this helps,
>
> Rui Barradas
>
>
>
> Citando Matthias Gondan <matthias-gondan at gmx.de>:
>
>
> 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/posti
>> ng-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> 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/posti
> ng-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list