[R] the less-than-minus gotcha
Martin Maechler
maechler at lynne.stat.math.ethz.ch
Tue Feb 3 10:42:05 CET 2015
>>>>> Steve Taylor <steve.taylor at aut.ac.nz>
>>>>> on Tue, 3 Feb 2015 03:11:47 +0000 writes:
> Nobody would write x=x or indeed x<-x; both are silly. If
> I found myself writing f(x=x) I might smirk at the
> coincidence, but it wouldn't bother me. I certainly
> wouldn't confuse it with assigning x to itself. By the
> way, here's another assignment operator we can use:
> `:=` = `<-` # this is going in my .Rprofile
> x := 1
I very much agree with you on that last point.
A while ago, about or shortly before when R was created, say ca. 1991-1993,
when S4 was "around the corner", and I was a beta tester for it,
and '=' was going to be introduced into the S language,
I had a fervent plea for considering ":=" as an alternative...
... but was never even replied to IIRC.
The fact that R's parser allows ':=' is an interesting
historic relict itself.
Before R even got a version number, R did not have packages yet,
there was "kind of a distinction" (don't ask me for details now)
between "base R functions" and "other R objects"
{If Ross Ihaka reads this, he will cringe I'm sure.. sorry, Ross!}
and all those used :=
The last version that still used this extensively 0.13, is still available
as R-0.13alpha.tar.gz (813570 bytes, dated Nov 7, 1996),
and contains a file src/library/base/median (note, no 'R'
subdirectory) which looks like this
---------------------------------------------------------------------
median := function(x, na.rm = FALSE) {
if(na.rm)
x <- x[!is.na(x)]
else if(any(is.na(x)))
return(NA)
n <- length(x)
half <- (n + 1)/2
if(n %% 2 == 1) {
sort(x, partial = half)[half]
}
else {
sum(sort(x, partial = c(half, half + 1))[c(half, half + 1)])/2
}
}
---------------------------------------------------------------------
so yes, ":=" had its nice history, but as it was not accepted
into S *instead* of '=', it also fell away for R ...
Martin Maechler,
ETH Zurich (and R Core team since "prehistory")
> -----Original Message----- From: Jeff Newmiller
> [mailto:jdnewmil at dcn.davis.ca.us] Sent: Tuesday, 3
> February 2015 3:54p To: Steve Taylor;
> r-help at stat.math.ethz.ch Subject: Re: [R] the
> less-than-minus gotcha
> I did not start out liking <-, but I am quite attached to
> it now, and even Rcpp feels weird to me now. This may seem
> like yet another variation on a theme that you don't find
> compelling, but I find that
> f(x=x)
> makes sense when scope is considered, but
> x=x
> on its own is silly. That is why I prefer to reserve = for
> assigning parameters... I use it to clarify that I am
> crossing scope boundaries, while <- never does. (<<- is a
> dangerous animal, though... to be used only locally in
> nested function definitions).
> In my view, this is similar to preferring == from
> C-derived syntaxes over the overloaded = from, say,
> Basic. I am sure you can get by with the syntactic
> overloading, but if you have the option of reducing
> ambiguity, why not use it?
> ---------------------------------------------------------------------------
> Jeff Newmiller The ..... ..... Go Live...
> DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live
> Go... Live: OO#.. Dead: OO#.. Playing Research Engineer
> (Solar/Batteries O.O#. #.O#. with /Software/Embedded
> Controllers) .OO#. .OO#. rocks...1k
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
> On February 2, 2015 5:57:05 PM PST, Steve Taylor
> <steve.taylor at aut.ac.nz> wrote:
>> Responding to several messages in this thread...
>>
>>> > All the more reason to use = instead of <- Definitely
>>> not!
>>
>> Martin and Rolf are right, it's not a reason for that; I
>> wrote that quickly without thinking it through. An "="
>> user might be more likely to fall for the gotcha, if not
>> spacing their code nicely. So the lesson learned from
>> the gotcha is that it's good to space your code nicely,
>> as others have siad, not which assignment symbol to use.
>>
>> However, I continue to use "=" for assignment on a daily
>> basis without any problems, as I have done for many
>> years. I remain unconvinced by any and all of these
>> arguments against it in favour of "<-". People telling
>> me that I "should" use the arrow need better agruments
>> than what I've seen so far.
>>
>> I find "<-" ugly and "->" useless/pointless, whereas "="
>> is simpler and also nicely familiar from my experience in
>> other languages. It doesn't matter to me that "=" is not
>> commutative because I don't need it to be.
>>
>>> Further it can be nicely marked up by a real "left
>>> arrow" by e.g. the listings LaTeX 'listings' package...
>>
>> Now that's just silly, turning R code into graphical
>> characters that are not part of the R language.
>>
>>> foo(x = y) and foo(x <- y)
>>
>> I'm well aware of this distinction and it never causes me
>> any problems. The latter is an example of bad
>> (obfuscated) coding, IMHO; it should be done in two lines
>> for clarity as follows:
>>
>> x = y foo(x)
>>
>>> Using = has it's problems too.
>> Same goes for apostrophes.
>>
>> Shall we discuss putting "else" at the start of line
>> next?
>>
>> cheers, Steve
>>
>> ______________________________________________
>> 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.
> ______________________________________________
> 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