Many thanks for these comments Simon, that really helps me a lot!

warm regards
David




On 23/04/13 19:30, Simon Urbanek wrote:
On Apr 23, 2013, at 12:43 PM, dpleydell wrote:

Many thanks Simon for your response
Identifying the source of the message is a non-trivial problem because there 
are a large number of calls to printf and fprintf etc in several thousands of 
lines of code spread over many different *.c files.


There should be none, so apparently you have broken the rules quite a lot ;). 
This is not a new rule, R just got better at identifying the transgressions. 
Number of lines in your code is quite irrelevant - that's why there is grep and 
the search function in editors.

Well, that wouldn't be the first time I've broken rules ;0)

But, how bad could the consequences of my misbehaviour be here?  Are we talking 
about crashing R or just messing the output a little?

We're not talking life and death here ;) - yes, frustrated users because of 
messed up output is the main danger here. Also the behavior changes by GUI and 
platform, so throw in inconsistency charge as well.

To be precise, there are two issues: a) the output on stdout/stderr is not 
necessarily visible (e.g. the Windows GUI discards it) and it is separate from 
the console (e.g. sink() doesn't work on it). More importantly b) it messes up 
the use of R in streaming, i.e. uses where you are processing input on stdin 
and streaming output on stdout -- it will break the output. This is most 
frustrating because the user has no way to control this behavior other than 
deleting the offending package.


In Writing R Extensions (current on-line version) the worst they say about 
printf is

[QUOTE]
The most useful function for printing from a C routine compiled into R is 
Rprintf. This is used in exactly the same way as printf, but is guaranteed to 
write to R's output (which might be a GUI console rather than a file, and can 
be re-directed by sink).
[UNQUOTE]

and both printf and fprintf are used in section 8.2.2 in the rtest.c example. 
Also, the manual does not say explicitly what fprintf should be replaced with.

fprintf() is ok as long as you don't use it with stdout/stderr. You can use it 
for files, no problem there.


Come to think of it... my package performs MCMC and uses fprintf to write 
samples to an output file. I have noticed that once in each nth blue-moon (for 
large n) a single line of output has been dropped or scrambled. More 
frequently, the updates of the output file seem to lag behind the progress of 
the algorithm's principal loop - for example, file size becomes non-zero much 
later than I expect.
Typically, I/O is buffered, so the file is not necessarily updated after you 
use fprintf(). By default, it will get updated only after the output buffer has 
been filled. You can use fflush() to flush the output buffer to disk 
immediately (alternatively you can mark the stream as unbuffered).


I never understood this behaviour or saw how to rectify it. Perhaps replacing fprintf 
with something else could "guarantee" the end of this undesirable behaviour? 
Great!

Is there a "safe" way to re-write the following?

fprintf(fMCMCout, "%d %e %e ", iteration, posteriorLoglik, parameter);
if (numberRandomEffects > 1) {
   for (k=0; k < numberRandomEffects; k++) {
     fprintf(fMCMCout, "%e ", randomEffects[k]);
}
fprintf(fMCMCout,"\n");

This is really a question of 2 parts
1) what is the best replacement of fprintf in the above?
If MCMCout is a file, the above is fine.


and
2) Writing R Extensions says "It is wise to write complete lines (including the 
"\n") before returning to R.", so is it legal to defer \n as in the example above?

Yes, sure.

Cheers,
Simon


many thanks
David





--
David Pleydell,
INRA,
UMR-1351 CMAEE,
Domaine Duclos,
Prise D'eau,
97122 Petit Bourg,
Guadeloupe

dpleyd...@antilles.inra.fr
pleyd...@cirad.fr

Tel +33 5 90 25 54 42
Fax +33 5 90 94 03 96




--
David Pleydell,
INRA,
UMR-1351 CMAEE,
Domaine Duclos,
Prise D'eau,
97122 Petit Bourg,
Guadeloupe
dpleyd...@antilles.inra.fr
pleyd...@cirad.fr
Tel +33 5 90 25 54 42
Fax +33 5 90 94 03 96

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to