From david.c.sterratt at ed.ac.uk  Sat May 12 23:40:21 2012
From: david.c.sterratt at ed.ac.uk (David Sterratt)
Date: Sat, 12 May 2012 22:40:21 +0100
Subject: [Rd] Replacements for stdout and stderr guaranteed to be open
 in all versions of R
In-Reply-To: <4FAD9473.8030306@gmail.com>
References: <1336772199.2290.27.camel@mabel>  <4FAD9473.8030306@gmail.com>
Message-ID: <1336858821.2294.39.camel@mabel>

On Fri, 2012-05-11 at 18:36 -0400, Duncan Murdoch wrote:
> On 12-05-11 5:36 PM, David Sterratt wrote:
> > Looking at
> > http://svn.r-project.org/R/trunk/src/gnuwin32/system.c
> > it would appear that R_Consolefile and R_Outputfile only point to open
> > files when CharacterMode == RTerm, not in GUI mode.
> >
> > Therefore my question is, are there any replacements for stdout and
> > stderr that work across all versions of R?
> 
> I'm pretty sure the answer is "no".  What you can do is have your 
> initialization code open a new handle (pointing to something that is not 
> stdout, e.g. a file), and then pass that to the Qhull function.

Thanks for your answer Duncan - it's lead me to the following solution,
which seems to work even with mcapply() in the multicore package, which
I thought might prove problematic.

In every file that refers to stdout, include (via

PKG_CPPFLAGS = -include myheader.h 

in the Makevars file):

        /* myheader.h */
        FILE * tmpstdout;
        #undef stdout
        #define stdout tmpstdout

Then in the file in which the function_requiring_FILE(double arg, FILE *
fp) is called:

        /* myfile.h */
        #include <Rembedded.h>          /* For R_tmpnam() */
        #include <unistd.h>             /* For unlink() */
        
        void my_function(double arg) {
          const char *name;
          name = R_tmpnam("Rf", R_TempDir);
          tmpstdout = fopen(name, "w");
          exitcode = function_requiring_FILE(arg, tmpstdout);
          fclose(tmpstdout);
          unlink(name);
          free((char *) name); 
        }

It's not exactly elegant, but it works for Linux, Mac and Windows (Rterm
and Rgui). I suppose I could use defines to use R_Consolefile for
platforms with Rinterface.h, but unless the above code is dangerous when
there are multiple threads, I will stick with it.

David.

-- 
David C Sterratt, Research Fellow. Tel: (+44) 131 651 1739
Institute for Adaptive and Neural Computation
School of Informatics, University of Edinburgh
Informatics Forum, 10 Crichton Street, Edinburgh EH8 9AB, Scotland, UK



[Rd] Replacements for stdout and stderr guaranteed to be open in all versions of R
David Sterratt