From murdoch.duncan at gmail.com  Tue Sep 24 00:50:32 2013
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Mon, 23 Sep 2013 18:50:32 -0400
Subject: [Rd] Capture output of install.packages (pipe system2)
In-Reply-To: <F165061B-F2DF-47CF-898F-920DC27C0DF7@r-project.org>
References: <CABFfbXtWhc48KviWCQXR84xGywm1GU0oMWk1Vk7s0EqbcAfT5g@mail.gmail.com>
	<5240A280.1000804@gmail.com>
	<F165061B-F2DF-47CF-898F-920DC27C0DF7@r-project.org>
Message-ID: <5240C5B8.4030301@gmail.com>

On 13-09-23 6:34 PM, Simon Urbanek wrote:
> Duncan,
>
> On Sep 23, 2013, at 10:20 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>
>> On 13-09-23 2:17 PM, Jeroen Ooms wrote:
>>> Is there any way to capture output (both stdout and stderr) from
>>> install.packages? Solutions like sink and capture.output don't work
>>> because the install.packages calls out to system2 which is executed in
>>> a separate process:
>>>
>>>      test <- capture.output(install.packages("MASS"))
>>>
>>> The system2 function does have arguments stdout and stderr but afaik
>>> these cannot be controlled via install.packages. I'm a bit reluctant
>>> to start rolling my own version of install.packages just for this
>>> reason.
>>>
>>> Is there any way to somehow grab this output? Or alternatively, is
>>> there a way to make R pipe stdout and stderr from system2 in such a
>>> way that they can be captured with sink or capture.output in the R
>>> parent process?
>>
>> See the recent thread <https://mailman.stat.ethz.ch/pipermail/r-devel/2013-September/067552.html> for an approach to this.
>>
>
> Can you, please, elaborate on how it is that relevant? The linked thread is talking about sink() which it irrelevant here (to quote the original e-mail "Solutions like sink and capture.output don't work because the install.packages calls out to system2 which is executed in a separate process:"). Something I missed?

Brian Ripley's reply describes how it is done in the tools package.  For 
example, as I sent privately to Jeroen,

x <- system2("Rscript", "-e \"install.packages('MASS',
repos='http://probability.ca/cran')\"", stdout=TRUE, stderr=TRUE)

captures all of the output from installing MASS.  As Jeroen pointed out, 
that isn't identical to running install.packages() in the current 
session; a real version of it should fill in more of the arguments, not 
leave them at their defaults.

Duncan Murdoch



> Re original question: there is keep_outputs which allows to re-direct a copy of the output into a file - at least for the actual install part of it.
> On top of my head for full capture I can only think of custom C code that will re-direct stderr/out FDs as desired (it's really trivial to re-direct to files, for dynamic capture it's a little more involved but there are examples that do that).
>
> Cheers,
> Simon
>
>



[Rd] Capture output of install.packages (pipe system2)
Duncan Murdoch