[R-SIG-Mac] Directing output to R.app GUI from compiled C code
Prof Brian Ripley
ripley at stats.ox.ac.uk
Sun Mar 30 23:13:28 CEST 2008
On Sun, 30 Mar 2008, Michael Braun wrote:
> Thank you for everyone's help on this. I think I have narrowed the
> issue down to the buffer. When I run R in the terminal, the line:
>
> fprintf(stdout,"testing\n");
>
> gets flushed after each line, but when I run under R.app, all calls
> get flushed at the end of my program.
>
> If I add the line
>
> fflush(stdout);
>
> after each fprintf call in R,app, the text is flushed as expected.
>
> The line
>
> fprintf(stderr,"testing\n");
>
> gets flushed line-by-line in both cases.
>
> So, for some reason, I need to flush the stdout buffer after each line
> in R.app, but not when I run R in terminal. This is an easy
> workaround, although I am interested by this would work differently in
> the terminal and GUI versions of R.
That is the (POSIX) standard behaviour: stdout is line-buffered when
writing to a terminal and fully buffered otherwise, and stderr is
unbuffered. (I understood that R.app displays output from these files
only when they contain a complete line.)
I was going to ask what buffering had been set on stdout, and suggest it
would be worth setting line buffering (via setvbuf) if the above analysis
is accurate.
> On Mar 29, 2008, at 7:00 PM, Simon Urbanek wrote:
>>
>> On Mar 29, 2008, at 6:03 PM, Michael Braun wrote:
>>
>>> My C code is complex (and obscure), so I'd hate to bore the rest of
>>> the list with the details. But perhaps this simple example will
>>> narrow things down. (My shared library is compiled using R CMD
>>> SHLIB, and loaded into R using dyn.load("xxx.so"). I call the
>>> function using the .C() function. The application is straight
>>> numerical computation, with no fancy graphics or anything like that.)
>>>
>>> If I print text using the R API function
>>>
>>> Rprintf("This is some text\n");
>>>
>>> then I see that text, whether I run R from either the terminal or
>>> using R.app. But, if I use, from the standard C library,
>>>
>>> printf("This is some text\n");
>>>
>>> then I see it if I run R in the terminal window, but NOT in R.app.
>>>
>>> A more complicated example is if I try to print a gsl vector
>>>
>>> gsl_vector_fprintf(stdout, X, "%.3f");
>>>
>>> The result shows up in the terminal window, but not in R.app. What
>>> I'd like to do is find something to replace stdout that would
>>> guarantee that the output goes to the appropriate R window.
>>>
>>> I'm not doing anything special to flush output (I'm a new C
>>> programmer--is this something I need to do?). I get this problem
>>> if I am trying to print a single line, as above, or a HUGE number
>>> of gsl_vectors (it was being caught in an infinite loop of printing
>>> vectors--and not seeing the output to let me know I was in the
>>> loop--that led me to this question).
>>>
>>> I hope this is detailed enough.
>>
>> Not really, because what you describe above works as designed:
>>
>> #include <R.h>
>> #include <stdio.h>
>> void foo() {
>> Rprintf("Friendly output\n");
>> fprintf(stderr, "this goes to stderr\n");
>> printf("Hello, world!\n");
>> }
>>
>>> dyn.load("foo.so")
>>> .C("foo")
>> Friendly output
>> list()
>> this goes to stderr
>> Hello, world!
>>
>> As you can see the stdout output is in gray, stderr is in red and
>> regular console output is in black (if you use default colors). All
>> is there. (Note, however, the output order is not necessary linear,
>> because stdout/err must be captured asynchronously).
>>
>>
>>> Please let me know if more information is needed.
>>
>> Which version of R and R.app are you using? Also the output can be
>> disabled in the preferences - if you did so, it won't appear. Can
>> you see the output of "system('ls')"?
>>
>> Cheers,
>> S
>>
>> [This message also contains rich version of the e-mail to illustrate
>> the point. Apologies to plain text recipients.]
>>
>>
>>>
>>> On Mar 29, 2008, at 5:24 PM, Simon Urbanek wrote:
>>>> Michael,
>>>>
>>>> On Mar 29, 2008, at 2:23 PM, Michael Braun wrote:
>>>>
>>>>> I am a recent convert from Linux to Mac (OS X 10.5.2 on a Mac
>>>>> Pro), and am trying to direct some output from compiled C code
>>>>> to the R.app GUI. For simple things, of course, I use Rprintf
>>>>> from the R API. But there are other cases (e.g., using the
>>>>> matrix print routines in GSL) for which Rprintf is
>>>>> inappropriate. When I was in Linux-land, I could direct the
>>>>> output to stdout with no problem (and I can still do that running
>>>>> R from a terminal window on OS X). But if I run my app under
>>>>> R.app, the output never makes it to the screen (naturally,
>>>>> because R.app is not standard output).
>>>>>
>>>>
>>>> If we are to assist you, you should tell us more about your
>>>> application (the C code), because R.app *does* print stdout and
>>>> stderr (just try running system("ls")). Your application is very
>>>> likely doing something to prevent the output from being processed
>>>> (not flushing the output, printing unterminated lines, not
>>>> allowing R to process events...).
>>>>
>>>> Cheers,
>>>> Simon
>>>>
>>>>
>>>>> So, is there an output file that I can use in place of stdout that
>>>>> will get my output to the R.app GUI (and preferably, to a terminal
>>>>> window session as well)?
>>>>>
>>>>> Thanks!
>>>>>
>>>>> Michael
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Michael Braun
>>>>> Assistant Professor of Management Science (Marketing Group)
>>>>> MIT Sloan School of Management
>>>>> One Amherst St., E40-169
>>>>> Cambridge, MA 02142
>>>>> braunm at mit.edu
>>>>> 617-253-3436
>>>>>
>>>>> _______________________________________________
>>>>> R-SIG-Mac mailing list
>>>>> R-SIG-Mac at stat.math.ethz.ch
>>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-mac
>>>>>
>>>>>
>>>>
>>>
>>> Michael Braun
>>> Assistant Professor of Management Science (Marketing Group)
>>> MIT Sloan School of Management
>>> One Amherst St., E40-169
>>> Cambridge, MA 02142
>>> braunm at mit.edu
>>> 617-253-3436
>>>
>>>
>>>
>>>
>>
>
> Michael Braun
> Assistant Professor of Management Science (Marketing Group)
> MIT Sloan School of Management
> One Amherst St., E40-169
> Cambridge, MA 02142
> braunm at mit.edu
> 617-253-3436
>
> _______________________________________________
> R-SIG-Mac mailing list
> R-SIG-Mac at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-mac
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-SIG-Mac
mailing list