[Rd] cerr and cout not working calling c++ from R

Simon Urbanek simon.urbanek at r-project.org
Sat May 7 04:09:06 CEST 2011


Sean,

the path form the console is not under your control and it depends heavily on the internal settings in R (is console enabled, is R interactive, is the output a tty or a file ...) - that's why you have to use Rprint/REprintf - that's the only path that is guaranteed to work. Anything else is settings-specific and not guaranteed to work (it may appear to work in limited settings, but will not work in others). Note that, for example, WriteConsole is only used if R is not fed via I/O pipes - that may be what baffled you in that case.

So AFAICS the only C++ solution (other than using Rprintf/REprintf directly) is to create streams to pipes whose ends will call Rprintf/REprintf with the content. Anything else is not general. You may want to ask Rcpp people (Dirk is CC'd anyway ;)) - I'd imagine they must have thought of it as it seems very natural to request in a C++ interface ... (but I don't use Rcpp so I don't know).

Cheers,
Simon



On May 6, 2011, at 3:19 PM, Sean Robert McGuffee wrote:

> Hi,
> 
> Thanks for the comments so far.
> 
> I've been going through the code extensively and seem to be having trouble
> reproducing what R is doing, so this confuses me. For example, when I write
> out the pointer values for ptr_R_WriteConsole type functions, I can't find a
> function that matches what is actually being called.
> 
> REprintf("Rstd_WriteConsole=%ld, ptr_R_WriteConsole=%ld,
> R_WriteConsole=%ld\n", Rstd_WriteConsole, ptr_R_WriteConsole,
> R_WriteConsole);
> 
> It might be something like RTcl_WriteConsole too. However, I can't seem to
> find the headers I would need to try to find it's pointer value. Anyway,
> these are often hidden/protected/static which is an aspect of code that I
> only understand in concept. The concept I understand about this type of
> stuff is that if you provide a better way of doing things, then maybe you
> hide some stuff that doesn't involve the better way. However, in this case,
> the hidden stuff is just making it difficult for me to debug and get to
> bottom of what is going on. Anyway, I get different results if I call on the
> functions that simply use stdout when trying to reproduce Rprintf
> functionality. I'm only doing that to try to get to the bottom of what R is
> doing with stdout and stderr. I also am having a similar issue with trying
> to understand what GNU GCC is doing with how it sync's cout and cerr with
> stdout and stderr. Maybe R is intercepting some of these components. Anyway,
> 
> I was hoping to get around the
> "5.6 Interfacing C++ code
>   ========================   [...]
>      Using C++ iostreams, as in this example, is best avoided.  There is
>   no guarantee that the output will appear in the R console, and indeed it
>   will not on the R for Windows console.  Use R code or the C entry points
>   (*note Printing::) for all I/O if at all possible."
> if at all possible. My reason is that I have 76386 lines of c++ code that
> I'm trying to interface with R, and it literally might be faster for me to
> update R rather than modify all of that code to suit R which seems to be
> lacking a c++ ostream interface.
> 
> Ideally, I'd write rout and rerr versions of cout and cerr for R to become
> more compatible with c++. I have had some trouble figuring a lot of this
> hidden stuff out. Strategies I have considered are the following:
> 1) Write macros that conditionally replace cerr and cout with Rprintf
> somehow throughout all of my c++ code that I'm trying to interface with R.
> 2) Recreate the std::cerr and std::cout type of classes but maybe add some
> extra functionality for callbacks to when i/o events take place to somehow
> try to fix things.
> 3) Make a scratch version of R source code that has no hidden aspects to try
> to investigate what is going on a little better.
> 
> Also, I should mention that I found an unanswered post from someone who had
> a similar problem when trying to use cerr and cout when accessing functions
> from dynamically linked libraries. I wonder, is it possible that R hasn't
> completely connected to these libraries? I mean, it's doing some sort of
> magic where it finds a pointer to a function, but maybe c++ has a lot going
> on in the background related to these ostream types that could be getting
> messed up. Maybe some aspects of the global environment might be different
> somehow? I directly link to my libraries via a c++ compiler when I get the
> identical functions to work from main in c++.
> 
> One final thing I'm considering is that the R manual also mentions something
> about garbage collection and some circumstances under which it's important
> to explicitly request pointers to be maintained. Is it possible that R is
> eating global pointers used by std::ostream ?
> 
> All suggestions are valued and if anyone has recommendations on strategy,
> please let me know.
> 
> Thanks,
> Sean
> 
> 
> On 5/6/11 2:50 PM, "Davor Cubranic" <cubranic at stat.ubc.ca> wrote:
> 
>> On 2011-05-06, at 11:41 AM, Dirk Eddelbuettel wrote:
>> 
>>> | I’m trying to call some of my c++ code from R and seem to be having an
>>> issue
>>> | with streams, although that’s just one obvious sign of something different
>>> | in performance between calling the same function from main in c++ vs.
>>> | calling the same function from R. [...]
>>> In a nutshell, R 'owns' your console. That is part of the Faustian bargain.
>> 
>> But isn't he redirecting cout to a file, so the C++ output is not to the
>> console?
>> 
>> Davor
> 
> 
> On 5/6/11 2:41 PM, "Dirk Eddelbuettel" <edd at debian.org> wrote:
> 
>> 
>> On 6 May 2011 at 14:21, Sean Robert McGuffee wrote:
>> | Hi,
>> | 
>> | Sorry, I just tried posting this but I had it in the wrong format of text,
>> | so this is a cleared format repost:
>> | 
>> | I’m trying to call some of my c++ code from R and seem to be having an issue
>> | with streams, although that’s just one obvious sign of something different
>> | in performance between calling the same function from main in c++ vs.
>> | calling the same function from R. I’m not getting any signs of errors from
>> | R, but the behavior is different somehow and in a way that breaks my
>> | algorithms. In both cases of launching a function from c++ or R, I redirect
>> | cout to a file using a streambuf. In particular, I can see progress stop
>> | when launching from R at a point when cout gets truncated when starting to
>> | write out iterator values in a std::vector<string>. Then, I find no way to
>> | write anything else to cout. When I write those values to Rprintf, they are
>> | there and they are as expected. I’ve tried setting
>> | ios_base::sync_with_stdio(false) in case R is messing with stdout and stderr
>> | somehow, but that made no difference. I’m not quite sure how R uses those C
>> | FILE* streams. Anyway, I am wondering if anyone has a hunch as to what might
>> | be going on. At this point I don’t know if it might be an issue with R not
>> | completely handling c++ from a library or if it is an issue with cout in
>> | particular or if there is something else I’m missing. Please let me know if
>> | you have any suggestions for me.
>> 
>> Doug Bates sometimes remarks that, once all other alternatives are exhausted,
>> one could consider reading the manual. And indeed, 'Writing R Extensions' has
>> this to say:
>> 
>>   5.6 Interfacing C++ code
>>   ========================
>> 
>>   [...]
>> 
>>      Using C++ iostreams, as in this example, is best avoided.  There is
>>   no guarantee that the output will appear in the R console, and indeed it
>>   will not on the R for Windows console.  Use R code or the C entry points
>>   (*note Printing::) for all I/O if at all possible.
>> 
>> In a nutshell, R 'owns' your console. That is part of the Faustian bargain.
>> 
>> Dirk
>> 
>> -- 
>> Gauss once played himself in a zero-sum game and won $50.
>>                      -- #11 at http://www.gaussfacts.com
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



More information about the R-devel mailing list