Hello, Here a small improvement for R. When you use the function write.table, if the disk is full for example, the function doesn't return an error and the file is written but truncated.
It can be a source of mistakes because you can then copy the output file and think everything is ok. How to reproduce ------------------------- >> write.csv(1:10000000, 'path') You must have a path with a small amount of disk available (on linux: http://souptonuts.sourceforge.net/quota_tutorial.html) I have joined the patch in this email. Can you open a bugzilla account for me to keep track of this change. Thanks, Jean-Sébastien Bevilacqua
Index: src/library/utils/src/io.c =================================================================== --- src/library/utils/src/io.c (révision 72357) +++ src/library/utils/src/io.c (copie de travail) @@ -1120,12 +1120,23 @@ for(int i = 0; i < nr; i++) { if(i % 1000 == 999) R_CheckUserInterrupt(); if(!isNull(rnames)) - Rconn_printf(con, "%s%s", - EncodeElement2(rnames, i, quote_rn, qmethod, - &strBuf, sdec), csep); + + if(Rconn_printf(con, "%s%s", EncodeElement2(rnames, i, quote_rn, qmethod, &strBuf, sdec), csep) < 0) { + error(_("IO error, cannot write table.")); + break; + } + for(int j = 0; j < nc; j++) { xj = VECTOR_ELT(x, j); - if(j > 0) Rconn_printf(con, "%s", csep); + + if(j > 0) { + if(Rconn_printf(con, "%s", csep) < 0) { + error(_("IO error, cannot write table.")); + i = nr; + break; + } + } + if(isna(xj, i)) tmp = cna; else { if(!isNull(levels[j])) { @@ -1148,9 +1159,17 @@ &strBuf, sdec); } } - Rconn_printf(con, "%s", tmp); + + if(Rconn_printf(con, "%s", tmp) < 0) { + error(_("IO error, cannot write table.")); + i = nr; + break; + } } - Rconn_printf(con, "%s", ceol); + if(Rconn_printf(con, "%s", ceol) < 0) { + error(_("IO error, cannot write table.")); + break; + } } } else { /* A matrix */ @@ -1163,20 +1182,36 @@ for(int i = 0; i < nr; i++) { if(i % 1000 == 999) R_CheckUserInterrupt(); - if(!isNull(rnames)) - Rconn_printf(con, "%s%s", - EncodeElement2(rnames, i, quote_rn, qmethod, - &strBuf, sdec), csep); + if(!isNull(rnames)) { + if(Rconn_printf(con, "%s%s", EncodeElement2(rnames, i, quote_rn, qmethod, &strBuf, sdec), csep) < 0) { + error(_("IO error, cannot write table.")); + break; + } + } for(int j = 0; j < nc; j++) { - if(j > 0) Rconn_printf(con, "%s", csep); + if(j > 0) { + if(Rconn_printf(con, "%s", csep) < 0) { + error(_("IO error, cannot write table.")); + i = nr; + break; + } + } if(isna(x, i + j*nr)) tmp = cna; else { tmp = EncodeElement2(x, i + j*nr, quote_col[j], qmethod, &strBuf, sdec); } - Rconn_printf(con, "%s", tmp); + if(Rconn_printf(con, "%s", tmp) < 0) { + error(_("IO error, cannot write table.")); + i = nr; + break; + } } - Rconn_printf(con, "%s", ceol); + + if(Rconn_printf(con, "%s", ceol) < 0) { + error(_("IO error, cannot write table.")); + break; + } } }
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel