# R-alpha: "invisible" : R_INVISIBLE .. -- repeat{} gives BOMB

Martin Maechler Martin Maechler <maechler@stat.math.ethz.ch>
Thu, 6 Nov 1997 11:55:17 +0100

```>>>>> "Martyn" == Martyn Plummer <plummer@iarc.fr> writes:

Martyn> maechler@stat.math.ethz.ch wrote:
>>  Try this (all versions of R from 0.49 to 0.60):
>>
>> test0 <- function() c(1,2) test <- function(two = FALSE) c(1,
>> if(two) 2) testR <- function(two = FALSE) return(c(1, if(two) 2))
>>
>> test0()# 1 2 as it should test() # <<<<<<<<<<<<<<<<<<<<<< INVISIBLE!
>> @#\$@!  test(T)# 1 2 print(test()) print(test(T))
>>
>> testR() # ok; NOT invisible...  testR(T)# 1 2

Martyn> The problem seems to be in do_if (eval.c) where the R_Visible
Martyn> flag is set to 0. Set it to 1 instead and your functions will
Martyn> work properly. You also get

R> if(F) 2
Martyn> NULL

R> if(F) 2
R>

Martyn> which is consistent with S-PLUS.

Wow, this was quick and precise,  thank you !!

I investigated some more:
R_VISIBLE is set to 0  ``R_Visible = 0;''
also in other places in eval.c :

line	C function

344:	  do_if
436:	  do_for
480:	  do_while
515:	  do_repeat
720:    \
727:     > do_set
738:    /
^^^
(line numbers from current 0.60)

In my opinion, only the three cases in do_set ("<-" things) should have
the invisibility flag...

testwh <- function(n = 1) c(1, while(n > 1) {n <- n-1; n})
testwh() # invisible !
testwh(2)
print(testwh()) # 1
print(testwh(2))# 1 1
##-- in Splus, both are visible

###-------- THIS IS EVEN WORSE:   Segmentation violation !!! -----

testrep <- function(n = 1) c(1, repeat {n <- n-1; if(n<=0) break})
testrep()
##R : Process R:1 segmentation violation at Thu Nov  6 11:36:27 1997

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

```