[R] return value of {....}

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Mon Jan 9 17:18:11 CET 2023


Às 14:47 de 09/01/2023, akshay kulkarni escreveu:
> Dear members,
>                               I have the following code:
> 
>> TB <- {x <- 3;y <- 5}
>> TB
> [1] 5
> 
> It is consistent with the documentation: For {, the result of the last expression evaluated. This has the visibility of the last evaluation.
> 
> But both x AND y are created, but the "return value" is y. How can this be advantageous for solving practical problems? Specifically, consider the following code:
> 
> F <- function(X) {  expr; expr2; { expr5; expr7}; expr8;expr10}
> 
> Both expr5 and expr7 are created, and are accessible by the code outside of the nested braces right? But the "return value" of the nested braces is expr7. So doesn't this mean that only expr7 should be accessible? Please help me entangle this (of course the return value of F is expr10, and all the other objects created by the preceding expressions are deleted. But expr5 is not, after the control passes outside of the nested braces!)
> 
> Thanking you,
> Yours sincerely,
> AKSHAY M KULKARNI
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using 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.

Hello,

Everything happens as you have described it, expr5 is accessible outside 
{}. Whether it is advantageous to solve pratical problems is another 
thing. The way f() is called creates variable `input` and this can be 
seen in many places of the R sources. Personally, I find it harder to 
read and prefer to break that one-liner into two instructions.

The code below shows a seldom pratical feature, if ever, put to work.


f <- function(X) {
   x <- X; y <- x*2
   u <- {
     z <- y     # expr5 creates a variable by assigning it a value
     z*pi       # expr7's value is assigned to u
   }
   v <- u + z   # expr5's value is accessible
   10 * v
}

# the call also creates input
f(input <- 1)
#> [1] 82.83185
.Last.value / 10
#> [1] 0.1
.Last.value - input*2
#> [1] -1
.Last.value / pi
#> [1] 0.3183099
.Last.value / 2
#> [1] 0.5
.Last.value == input
#> [1] TRUE


Hoep this helps,

Rui Barradas



More information about the R-help mailing list