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]]
Dear Bill, All makes perfect sense (including the late evaluation). I actually discovered the problem by looking at old code which used your proposed solution. Still I find it strange (and, hnestly, I don?t like R?s behavior in this respect), and I am wondering why u is not being copied to L just before u is assigned a new value. Of course, this would require the R interpreter to track all these dependencies in both ways incl. more complicated ones in which L might depend on more than just u. In the future, I?ll avoid dependencies between parameters. Su4 <- function(u=100, l=100, mu=0.53, sigma2=4.3^2) # instead of l=u And maybe also ?in-place? changes of values? Best regards, Matthias Von: William Dunlap Gesendet: Samstag, 2. September 2017 19:41 An: Rui Barradas Cc: Matthias Gondan; r-help at r-project.org Betreff: Re: [R] Strange lazy evaluation of default arguments 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/posting-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/posting-guide.html and provide commented, minimal, self-contained, reproducible code. [[alternative HTML version deleted]]
>In the future, I?ll avoid dependencies between parameters.You don't need to cut off your nose to spite your face... you are the one writing the code that breaks the dependency, so you have the option to not write your code that way (e.g. by using force() as Rui suggests). -- Sent from my phone. Please excuse my brevity. On September 2, 2017 10:53:14 AM PDT, Matthias Gondan <matthias-gondan at gmx.de> wrote:>Dear Bill, > >All makes perfect sense (including the late evaluation). I actually >discovered the problem by looking at old code which used your proposed >solution. Still I find it strange (and, hnestly, I don?t like R?s >behavior in this respect), and I am wondering why u is not being copied >to L just before u is assigned a new value. Of course, this would >require the R interpreter to track all these dependencies in both ways >incl. more complicated ones in which L might depend on more than just >u. > >In the future, I?ll avoid dependencies between parameters. > >Su4 <- function(u=100, l=100, mu=0.53, sigma2=4.3^2) # instead of l=u > >And maybe also ?in-place? changes of values? > >Best regards, > >Matthias > >Von: William Dunlap >Gesendet: Samstag, 2. September 2017 19:41 >An: Rui Barradas >Cc: Matthias Gondan; r-help at r-project.org >Betreff: Re: [R] Strange lazy evaluation of default arguments > >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/posting-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/posting-guide.html >and provide commented, minimal, self-contained, reproducible code. > > > > [[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.