Hello: Here is a bit of R-code:> mvr[1] 2.2658> (sin(.Last.value)+sin(2*.Last.value))[1] -0.2156507> acos((-sqrt(17)-1)/8)[1] 2.2658> (sin(.Last.value)+sin(2*.Last.value))[1] 1.76745> (sin(mvr)+sin(2*mvr))[1] -0.2156507>Note that my variable mvr is the value of acos((-sqrt(17)-1)/8). However, if I use .Last.value after invoking the acos function in a further calculation, I get a nonsensical result. What is going on? I am running R version 4.0.0 (2020-04-24) on an iMac, operating system MacOS 11.4 ?Big Sur?. Mik Bickis
Behaviour is confirmed on 4.1.0 on Ubuntu 20.04 and Windows 10. What's happening is (sin(.Last.value) + sin(2 * .Last.value)) is evaluating the first sin(.Last.value) which resolves to 0.7680514 then using that in the second expression, sin(2*.Last.value) := sin(2 * 0.7680514) which resolves to 0.9993982. Add them together to get the 1.76745 value you're showing. Interestingly, if you're using R Studio, if you go to Tools > Global Options > General > Advanced > Other and check "Show .Last.Value in environment listing," then acos((-sqrt(17) - 1) / 8) # [1] 2.2658 (sin(.Last.value)+sin(2*.Last.value)) # [1] -0.2156507 Sadly, .Last.value isn't very well documented. The only thing I see in the manuals is in R-ints, https://cran.r-project.org/doc/manuals/r-release/R-ints.html#Base-environment> Similarly, the evaluator creates a symbol .Last.value which appears as a variable in the base environment.Playing around though, it seems if the last value is the result of a symbol lookup or assignment, .Last.value seems to do something like "re-evaluate" the symbol, resetting the .Last.value value to the stored value each time, whereas if the last expression evaluated returns a pure value, calling .Last.value in an expression can update the .Last.value value. 1 #> [1] 1 # This is evaluated as 1 + (1) + (2) + (4) + (8) as .Last.Value changes each time. .Last.value + .Last.value + .Last.value + .Last.value + .Last.value #> [1] 16 x <- 1 # This is evaluated as 1 + 1 + 1 + 1 + 1 .Last.value + .Last.value + .Last.value + .Last.value + .Last.value #> [1] 5 x <- 1 x # This is still evaluated as 1 + 1 + 1 + 1 + 1 .Last.value + .Last.value + .Last.value + .Last.value + .Last.value #> [1] 5 1 # This is also evaluated as 1 + 1 + 1 + 1 + 1 (x <- .Last.value) + .Last.value + .Last.value + .Last.value + .Last.value Created on 2021-06-19 by the [reprex package](https://reprex.tidyverse.org) (v2.0.0.9000) The lesson here is .Last.value should (almost) never be used programmatically, and in an interactive context the only approved use of it is to store a result before losing it. On Fri, Jun 18, 2021 at 11:03 PM Bickis, Mikelis <bickis at math.usask.ca> wrote:> > Hello: > > Here is a bit of R-code: > > > mvr > [1] 2.2658 > > (sin(.Last.value)+sin(2*.Last.value)) > [1] -0.2156507 > > acos((-sqrt(17)-1)/8) > [1] 2.2658 > > (sin(.Last.value)+sin(2*.Last.value)) > [1] 1.76745 > > (sin(mvr)+sin(2*mvr)) > [1] -0.2156507 > > > > Note that my variable mvr is the value of acos((-sqrt(17)-1)/8). However, if I use .Last.value after invoking the acos function in a further calculation, I get a nonsensical result. What is going on? > > I am running R version 4.0.0 (2020-04-24) on an iMac, operating system MacOS 11.4 ?Big Sur?. > > Mik Bickis > ______________________________________________ > 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.
iuke-tier@ey m@iii@g oii uiow@@edu
2021-Jun-19 14:26 UTC
[R] [External] Unexplained behaviour of .Last.value
Thanks for the report. Fixed in R-devel in r80530; will port to R-patched soon. Best, luke On Fri, 18 Jun 2021, Bickis, Mikelis wrote:> Hello: > > Here is a bit of R-code: > >> mvr > [1] 2.2658 >> (sin(.Last.value)+sin(2*.Last.value)) > [1] -0.2156507 >> acos((-sqrt(17)-1)/8) > [1] 2.2658 >> (sin(.Last.value)+sin(2*.Last.value)) > [1] 1.76745 >> (sin(mvr)+sin(2*mvr)) > [1] -0.2156507 >> > > Note that my variable mvr is the value of acos((-sqrt(17)-1)/8). However, if I use .Last.value after invoking the acos function in a further calculation, I get a nonsensical result. What is going on? > > I am running R version 4.0.0 (2020-04-24) on an iMac, operating system MacOS 11.4 ?Big Sur?. > > Mik Bickis > ______________________________________________ > 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.-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu