Hacker News new | ask | show | jobs
by ltjohnson 5631 days ago
Using '<-' is the general style of the R community. The accepted (but not universal) practice is to use '<-' for assignment and '=' in argument passing. This is a good idea because '<-' and '=' are not equivalent and '<-' is more likely the operator you want. From the help page [1] The operator ‘<-’ can be used anywhere, whereas the operator ‘=’ is only allowed at the top level (e.g., in the complete expression typed at the command prompt) or as one of the subexpressions in a braced list of expressions. That being said, some R community members still use '=' for assignment, but it's frowned upon. It certainly annoys me when I see it in R code.

Simple example to show when '=' won't work but '<-' will. Pilfered from "R Inferno" [2], which is an excellent reference for R idioms and best practices.

  system.time(vec1 <- rnorm(1000))
  mean(vec1)
  system.time(vec2 = rnorm(1000))
  mean(vec2)
And to demonstrate that you need to use '=' for argument passing:

  x <- c(3,4,NA)
  mean(x)
  mean(x, na.rm=TRUE)
  mean(x, na.rm<-TRUE)
[1] Type help('=') at an R prompt, or view it online: http://stat.ethz.ch/R-manual/R-patched/library/base/html/ass...

[2] http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

edit: clarified statement.

edit: added examples.

1 comments

I am of the opposite opinion, but perhaps I can be converted.

Do you have an example of where it would be required to use '<-'? Not just median(x <- 10), but a use in which there no simple '=' alternative.

I've added some examples to my above comment. My example is perhaps a little closer to 'median(x <- 10)' than you were asking for, but I think it illustrates the point that using '=' will not always have the desired result in places where '<-' would.
My problem is that between work in work and work in startup I need to write in about 8 languages.

This applies in all languages:

vec1 = rnorm(100)

system.time(vec1)

mean(vec1)

And, I can get my colleagues to fix it when I screw up, even though they are not R-heads.

You gotta do what you gotta do, but your example probably doesn't do what you want in R.

  > system.time(vec1 <- rnorm(1000000))
     user  system elapsed 
    0.200   0.000   0.199 
My computer takes .2 seconds to generate the million random normals and assign them to vec1.

  > vec1 = rnorm(1000000)
  > system.time(vec1)
     user  system elapsed 
        0       0       0 
 
My computer only takes 0 seconds to evaluate the existing vec1 of length one million.
Ah - sorry - I was being a bit t'ick, and didn't twig the time thing. Should I require it, I will keep it in mind. Thank you.