I suspect akshay is (or was? Not sure) unclear about what braces do. They are
not closures... they create an expression that wraps multiple expressions into
one expression... they are a little more like parentheses than closures. They
are not intrinsically associated with creation of environments for holding
variables.
Functions are closures... they run in a call-specific environment that inherits
from the environment where the function was defined. Blocks (created with
braces) simply work with the environment in which they are constructed directly.
If you want a block that creates a new local environment without defining a new
function then pass your code block to the ?local function.
On January 9, 2023 8:59:12 AM PST, Bert Gunter <bgunter.4567 at gmail.com>
wrote:>Perhaps the following may be of use to you.
>
>Consider:
>
>> f <- function(){ x <- 3; function(y) x+y}
>> x <- 5
>
>##What does this give?
>> f()
>## Why?
>## How about this?
>>f()(10)
>## Why?
>
>## If you remove "x <- 3" from the above, what will you get
when you repeat
>the exercise?
>
>-- Bert
>
>On Mon, Jan 9, 2023 at 8:29 AM Bert Gunter <bgunter.4567 at gmail.com>
wrote:
>
>> Unless you do something special within a function, only the value(s)
>> returned are available to the caller. That is the essence of
>> functional-type programming languages.
>>
>> You need to read up on (function) environments in R . You can search on
>> this. ?function and its links also contain useful information, but it
may
>> too terse to be explicable to you. There are of course many available
>> references on the internet.
>>
>> I believe your mental model for how R works is flawed, and you have
some
>> homework to do to correct it. I may be wrong, naturally, but you can
judge
>> by looking at some tutorials.
>>
>> -- Bert
>>
>> On Mon, Jan 9, 2023 at 6:47 AM akshay kulkarni <akshay_e4 at
hotmail.com>
>> wrote:
>>
>>> 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.
--
Sent from my phone. Please excuse my brevity.