return value of {....}
Returning the last value of { is the basis of functions not needing a
return statement. Before R invokes a function (specifically a closure), it
creates a new context. When R evaluates a call to return, it looks for a
context to return from and finds the context of function, ending the
context and the evaluation of the function body early. However, if you
don't use return, R just returns the value from evaluating the function
body, and if your function body starts with {, it will return the last
expression from the function body, as desired.
On Mon, Jan 9, 2023, 12:15 akshay kulkarni <akshay_e4 at hotmail.com> wrote:
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 at petzel.at>
Sent: Monday, January 9, 2023 9:18 PM
To: akshay kulkarni <akshay_e4 at hotmail.com>
Cc: R help Mailing list <r-help at 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 at 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 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.