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

akshay kulkarni @k@h@y_e4 @end|ng |rom hotm@||@com
Tue Jan 10 15:32:48 CET 2023


Dear Avi,
                 Thanks for your reply...your exhortations are indeed justified...! But one caveat: I was not complaining about anything...just was curious of the rationale of a particular design....Thanks again...

Thanking you,
Yours sincerely,
AKSHAY M KULKARNI
________________________________
From: R-help <r-help-bounces using r-project.org> on behalf of avi.e.gross using gmail.com <avi.e.gross using gmail.com>
Sent: Tuesday, January 10, 2023 4:39 AM
Cc: 'R help Mailing list' <r-help using r-project.org>
Subject: Re: [R] return value of {....}

Akshay,

Your question seems a tad mysterious to me as you are complaining about
NOTHING.

R was designed to return single values. The last statement executed in a
function body, for example, is the value returned even when not at the end.

Scoping is another issue entirely. What is visible is another discussion.

So, yes, if you can see ALL the variables, you might see the last one BUT
there often is no variable at the end. There is an expression that evaluates
to a value with no NAME attached. You cannot reference that unless the block
in curly braces returns that value.

You can design your own language any way you want. The people who designed R
did it this way. Mind you, the most common use of curly braces is probably
in function bodies, or if/else blocks and loops, not quite what you are
looking at and complaining about. The design is what it is.

Others require things like an explicit return() statement. R chose not to.

And if the value is redundant for you, who cares?

Did you know that when running a program in the interpreter the last value
is stored in a variable like this:

> x <- 6
> .Last.value
[1] 6

Why would that duplicate be needed or useful?

Consider a partial calculation you want to reuse in another context:

> y = x*2 + 2*x -3
> z <- .Last.value/2
> z
[1] 10.5

Yes, you could have used "y" ...




-----Original Message-----
From: R-help <r-help-bounces using r-project.org> On Behalf Of akshay kulkarni
Sent: Monday, January 9, 2023 12:06 PM
To: Valentin Petzel <valentin using petzel.at>
Cc: R help Mailing list <r-help using r-project.org>
Subject: Re: [R] return value of {....}

Dear Valentin,
                          But why should {....} "return" a value? It could
just as well evaluate all the expressions and store the resulting objects in
whatever environment the interpreter chooses, and then it would be left to
the user to manipulate any object he chooses. Don't you think returning the
last, or any value, is redundant? We are living in the 21st century world,
and the R-core team might,I suppose, have a definite reason for"returning"
the last value. Any comments?

Thanking you,
Yours sincerely,
AKSHAY M KULKARNI

________________________________
From: Valentin Petzel <valentin using petzel.at>
Sent: Monday, January 9, 2023 9:18 PM
To: akshay kulkarni <akshay_e4 using hotmail.com>
Cc: R help Mailing list <r-help using r-project.org>
Subject: Re: [R] return value of {....}

Hello Akshai,

I think you are confusing {...} with local({...}). This one will evaluate
the expression in a separate environment, returning the last expression.

{...} simply evaluates multiple expressions as one and returns the result of
the last line, but it still evaluates each expression.

Assignment returns the assigned value, so we can chain assignments like this

a <- 1 + (b <- 2)

conveniently.

So when is {...} useful? Well, anyplace where you want to execute complex
stuff in a function argument. E.g. you might do:

data %>% group_by(x) %>% summarise(y = {if(x[1] > 10) sum(y) else mean(y)})

Regards,
Valentin Petzel

09.01.2023 15:47:53 akshay kulkarni <akshay_e4 using hotmail.com>:

> 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.

        [[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.

______________________________________________
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.

	[[alternative HTML version deleted]]



More information about the R-help mailing list