[Rcpp-devel] Redirecting cout/cerr streams to Rprintf

Romain Francois romain at r-enthusiasts.com
Wed Oct 23 13:51:07 CEST 2013


Le 21/10/2013 12:24, Renaud Gaujoux a écrit :
> Hi,
>
> this is somehow a general C++ question, but it could be of interest to
> all Rcpp users (I think).
>
> Still for the purpose of RcppOctave, I would like to redirect cout and
> cerr streams that are used by Octave to Rprintf REprintf respectively.
> Currently I redirect these streams to 2 temporary stringstreams (via the
> std::cout.rdbuf get/set methods ) which buffer the output/errors
> messages and print them at the end of the Octave call. The standard
> streams are restored on exiting the function (in a class destructor).
>
> However, I would like to do this without buffering, i.e. that messages
> are printed as they come through the stream. This should be possible
> through the definition of a std::stream child class with some method
> overload that output the formatted messages as they are pushed into the
> stream.
>
> Anybody knows which class and method(s) need to be overloaded, or have
> hints on how to achieve this in an -- aesthetic -- way?
>
> Thank you.
>
> Bests,
> Renaud

Hello,

Rcpp11 does this by default now instead of the behavior that is in Rcpp, 
which depends on the Rcpp::Rcout and Rcpp::cerr. See e.g. 
https://github.com/romainfrancois/Rcpp11/blob/master/src/Rcpp11_init.cpp

In Rcpp, you would just have to grab the rdbuf of cout, remember it, set 
it to something different and then later reset it. You can take 
advantage of C++ constructor/destructor anddo something like this:

class Sinker {
public:
     Sinker(): remembered_buffer(std::cout.rdbuf() ){
         std::cout.rdbuf( Rcout.rdbuf() ) ;
     }

     ~Sinker(){
         std::cout.rdbuf( remembered_buffer  ) ;
     }

private:
     std::streambuf* remembered_buffer ;
}  ;

Then, whenever you want this redirection, you just have to create a 
Sinker object:

void foo(){
     Sinker bar ;
     // call whatever that uses cout
}

Romain

-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30



More information about the Rcpp-devel mailing list