[Rd] Subtle bug in write.csv

Hadley Wickham h.wickham at gmail.com
Thu Apr 4 15:49:49 CEST 2013


There's a subtle bug in write.csv -

write.csv(mtcars, "mtcars.csv", row = FALSE)
# Error in write.table(mtcars, "mtcars.csv", row = FALSE, col.names = NA,  :
#  col.names = NA makes no sense when row.names = FALSE

write.csv(mtcars, "mtcars.csv", row.names = FALSE)
# Works

i.e. the special evaluation used by write.csv has broken R's regular
argument matching mechanics.

This is straightforward to fix.  Replace the first line:

Call <- match.call(expand.dots = TRUE)

with

Call <- match.call(write.table, expand.dots = TRUE)

so the named arguments in write.table are used for argument matching.

Alternatively, I think you could replace the complex call munging just
by calling read.table with different default arguments:

write.csv <- function(x, file = "", sep = ",", qmethod = "double", ...) {
  write.table(x = x, file = file, sep = sep, qmethod = qmethod, ...)
}

but perhaps this introduces some undesirable behaviour that I'm missing.

Hadley

--
Chief Scientist, RStudio
http://had.co.nz/



More information about the R-devel mailing list