[R] using ``<-'' in function argument

Michael Bedward michael.bedward at gmail.com
Fri Dec 3 10:48:48 CET 2010


It's only obvious when someone points it out :)

fubar is not created because, in the test x > 3 returned FALSE, which
means the cat function doesn't get used, which means the y arg (fubar
<- 6) is never required and therefore not evaluated.

Evil isn't it ?

Michael

On 3 December 2010 20:18, Ivan Calandra <ivan.calandra at uni-hamburg.de> wrote:
> See below
>
> Le 12/3/2010 06:54, Berwin A Turlach a écrit :
>>
>> On Thu, 2 Dec 2010 23:34:02 -0500
>> David Winsemius<dwinsemius at comcast.net>  wrote:
>>
>>> [...] Erik is telling you that your use of ncol<-4 got evaluated to
>>> 4 and that the name of the resulting object was ignored, howevert the
>>> value of the operation was passed on to matrix which used positional
>>> matching since "=" was not used.
>>
>> Sounds like a fair summary of what Erik said, but it is subtly wrong.
>> R has lazy evaluation of its arguments.  There is nothing that forces
>> the assignment to be evaluated and to pass the result into the
>> function.  On the contrary, the assignment takes place when the
>> function evaluates the argument.  For example:
>>
>> R>  rm(list=ls(all=TRUE))
>> R>  ls()
>> character(0)
>> R>  foo<- function(x, y){
>> + if (x>  3) cat(y, "\n")
>> + x}
>> R>  foo(4, bar<- 5)
>> 5
>> [1] 4
>> R>  ls()
>> [1] "bar" "foo"
>> R>  bar
>> [1] 5
>> R>  foo(2, fubar<- 6)
>> [1] 2
>> R>  fubar
>> Error: object 'fubar' not found
>> R>  ls()
>> [1] "bar" "foo"
>
> Could you explain what's happening here?! In the first case "bar" is
> created, but in the second "fubar" is not... Why is that? Am I missing
> something obvious?
>>>
>>> Usually the problem facing newbies is that they want to save
>>> keystrokes and so use "=" for assignment (also a potential pitfall
>>> although not as likely to mess you up as the choice to use the
>>> two-keystroke path for argument assignment).
>>
>> On the contrary, the opposite is also very likely.  One of my favourite
>> idioms is:
>>
>>        plot(fm<- lm(y~x, data=some.data))
>>
>> to (1) fit a model, (2) assign the fitted model to an object and (3)
>> look immediately at diagnostic plots.
>>
>> Students came to me and said that the code in the lab sheet didn't
>> work and they were getting strange error messages "about objects not
>> being found".  They reassured me that they had typed in exactly what
>> was on the lab sheet.  Of course, once I got to their computer and
>> looked at their screen, it was clear that they had typed:
>>
>>        plot(fm = lm(y~x, data=some.data))
>
> It's not much more complicated to type it in two lines, but it's much
> clearer and safer!
>>
>> Cheers,
>>
>>        Berwin
>>
>> ========================== Full address ============================
>> Berwin A Turlach                      Tel.: +61 (8) 6488 3338 (secr)
>> School of Maths and Stats (M019)            +61 (8) 6488 3383 (self)
>> The University of Western Australia   FAX : +61 (8) 6488 1028
>> 35 Stirling Highway
>> Crawley WA 6009                e-mail: berwin at maths.uwa.edu.au
>> Australia                        http://www.maths.uwa.edu.au/~berwin
>>
>> ______________________________________________
>> R-help at 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.
>>
>
> --
> Ivan CALANDRA
> PhD Student
> University of Hamburg
> Biozentrum Grindel und Zoologisches Museum
> Abt. Säugetiere
> Martin-Luther-King-Platz 3
> D-20146 Hamburg, GERMANY
> +49(0)40 42838 6231
> ivan.calandra at uni-hamburg.de
>
> **********
> http://www.for771.uni-bonn.de
> http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php
>
> ______________________________________________
> R-help at 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.
>



More information about the R-help mailing list