[R] Return value from function with For loop

David Winsemius dwinsemius at comcast.net
Mon Apr 17 08:36:12 CEST 2017


Both 'for' and 'next' return TRUE from is.function 

is.function('for')
is.function('next')

Not at an R console at the moment but I did check this earlier today. Thinking of it as different is definitely the way to think about it. (ISTR Bert and I have had this exchange in the past.)

-- 
Best
David

Sent from my iPhone

> On Apr 16, 2017, at 9:50 PM, Bert Gunter <bgunter.4567 at gmail.com> wrote:
> 
> David et. al.:
> 
> "this levels is the level where you realize that the `for` function is
> different from most other R functions.  It is really a
> side-effect-fucntion. "
> 
> for(), while(), if(), next, etc. are *not* functions.
> 
> ?for says: "These are the basic control-flow constructs of the R language."
> 
> They do not "return" values. They control program flow, whence what
> you call "side effects" are actually expressions that are parsed and
> evaluated
> 
> viz.
> 
>> if(TRUE)10
> [1] 10
> 
> ## but
> 
>> if(FALSE) 5
> ## nothing is returned, not even NULL
>> for(i in 1:3) i
> ## Ditto
> 
>> z <- NULL
>> z <- for(i in 1:3)i
>> z
> NULL ## still
> 
> Cheers,
> Bert
> 
> 
> 
> 
> Cheers,
> Bert
> 
> 
> 
> 
> Bert Gunter
> 
> "The trouble with having an open mind is that people keep coming along
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
> 
> 
>> On Sun, Apr 16, 2017 at 8:12 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>> 
>>> On Apr 16, 2017, at 7:26 PM, Ramnik Bansal <ramnik.bansal at gmail.com> wrote:
>>> 
>>> In the code below
>>> 
>>> 
>>> *ff <- function(n){ for(i in 1:n) (i+1)}*
>>> 
>>> *n<-3;ff(n)->op;print(op)*
>>> 
>>> Why doesnt *print(op) * print 4 and instead prints NULL.
>>> Isnt the last line of code executed is *i+1 * and therefore that should be
>>> returned instead of NULL
>>> 
>>> instead if I say
>>> *ff <- function(n){ (n+1) }*
>>> 
>>> Then
>>> *n<-3;ff(n)->op;rm(n);print(op)*
>>> gives 4 as output.
>>> 
>>> My question is *Which *is considered as the last line in a functoin for the
>>> purpsoe of default return ? And under what conditions ?
>> 
>> It's probably a good thing that you are confused. It suggests that you are actually "getting" the R-paradigm. Unfortunately for the new user of R, there are several levels of understanding to pass through. First, you realize that function-results need to be assigned to names in order to persist. Then there is the next level where you discover that there are exceptions to that rule: this levels is the level where you realize that the `for` function is different from most other R functions.  It is really a side-effect-fucntion. The assignments made within its body actually persist in the global environment. AND it returns NULL. It shares this anomalous behavior with `while` and `repeat`.n Almost all functions are invoked with a possibly empty argument list.  The next and break functions have implicit paired (empty) parentheses.
>> 
>> (My personal opinion is that this is not adequately advertised. Perhaps it is an attempt to get people to migrate away from "Fortran-coding" behavior?)
>> 
>> --
>> David.
>> 
>> 
>>> 
>>> -Thanks,
>>> Ramnik
>>> 
>>>      [[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.
>> 
>> David Winsemius
>> Alameda, CA, USA
>> 
>> ______________________________________________
>> 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.



More information about the R-help mailing list