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/