On 20/07/2014, 5:46 PM, David Winsemius wrote: > > On Jul 20, 2014, at 6:30 AM, Duncan Murdoch wrote: > >> On 17/07/2014, 10:00 PM, Dario Strbenac wrote: >>> The example in the question was not inside a user function. >> >> The explanations you were given were slightly inaccurate. The usual >> rule is that results returned at the top level are printed unless they >> are marked as invisible. (There are a few cases where "top level" is >> faked, e.g. in example code, and in Sweave.) >> >> When you do something like >> >> if(test) { a; b; c } >> >> you have an expression that returns NULL invisibly if the test is FALSE, >> and returns the value of the block (i.e. c) visibly if it is TRUE. It >> is the value of the if that is printed. >> >> There is no difference in the handling of a, b and c: each is an >> expression that returns the value of the corresponding variable without >> marking it as invisible. But none of them are top-level expressions, so >> none of them print. > > I'm not sure what that last one was intended to mean but it seemed to imply > that nothing would be printed if those expressions had values (even if the > interpreter were able to find values in one of hte enclosing environments). > That would not be what I expected. I think of curved-braces as a function and > the results of the last evaluation would be expected to be returned:
I don't understand your misunderstanding. The expression "{ a; b; c }" (ignore the quotes here and later) is found by evaluating a, then evaluating b, then evaluating c, and the value of c is returned as the value of the whole expression. Braces don't affect visibility, so if c is 4 and no error occurs, the value of "{ a; b; c }" is a visible 4. >> test <- TRUE >> a=2;b=3;c=4 >> if(test){a;b;c} > [1] 4 In this case, the expression isn't "{ a; b; c }", it's "if (test) { a; b; c }". Since test is TRUE, that returns the value of "{ a; b; c }" visibly, i.e. the value is 4. If test had been FALSE, the value would be NULL, marked as invisible. Braces don't affect visibility, but parens do, so if (FALSE) 4 and {if (FALSE) 4} both print nothing, but (if (FALSE) 4) will print NULL. All three versions have the value NULL, as you could see if you assigned them to a variable, e.g. x <- if (FALSE) 4 x x <- {if (FALSE) 4} x x <- (if (FALSE) 4) x which will print NULL three times. > > If one of them had no value, an error would be thrown. > >> rm(b) >> if(test){a;b;c} > Error: object 'b' not found I don't see what this has to do with the previous discussion. If you thought I was talking about errors in expressions, you misunderstood me. Duncan Murdoch ______________________________________________ R-help@r-project.org mailing list 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.