[Rd] withAutoprint({ .... }) ?

Kirill Müller kirill.mueller at ivt.baug.ethz.ch
Fri Sep 2 16:48:23 CEST 2016


On 02.09.2016 14:38, Duncan Murdoch wrote:
> On 02/09/2016 7:56 AM, Martin Maechler wrote:
>> On R-help, with subject
>>    '[R] source() does not include added code'
>>
>>>>>>> Joshua Ulrich <josh.m.ulrich at gmail.com>
>>>>>>>     on Wed, 31 Aug 2016 10:35:01 -0500 writes:
>>
>>     > I have quantstrat installed and it works fine for me. If you're
>>     > asking why the output of t(tradeStats('macross')) isn't being 
>> printed,
>>     > that's because of what's described in the first paragraph in the
>>     > *Details* section of help("source"):
>>
>>     > Note that running code via ‘source’ differs in a few respects from
>>     > entering it at the R command line.  Since expressions are not
>>     > executed at the top level, auto-printing is not done. So you will
>>     > need to include explicit ‘print’ calls for things you want to be
>>     > printed (and remember that this includes plotting by ‘lattice’,
>>     > FAQ Q7.22).
>>
>>
>>
>>     > So you need:
>>
>>     > print(t(tradeStats('macross')))
>>
>>     > if you want the output printed to the console.
>>
>> indeed, and "of course"" ;-)
>>
>> As my subject indicates, this is another case, where it would be
>> very convenient to have a function
>>
>>    withAutoprint()
>>
>> so the OP could have (hopefully) have used
>>    withAutoprint(source(..))
>> though that would have been equivalent to the already nicely existing
>>
>>    source(.., print.eval = TRUE)
>>
>> which works via the  withVisible(.) utility that returns for each
>> 'expression' if it would auto print or not, and then does print (or
>> not) accordingly.
>>
>> My own use cases for such a withAutoprint({...})
>> are demos and examples, sometimes even package tests which I want to 
>> print:
>>
>> Assume I have a nice demo / example on a help page/ ...
>>
>> foo(..)
>> (z <- bar(..))
>> summary(z)
>> ....
>>
>> where I carefully do print parts (and don't others),
>> and suddenly I find I want to run that part of the demo /
>> example / test only in some circumstances, e.g., only when
>> interactive, but not in BATCH, or only if it is me, the package 
>> maintainer,
>>
>> if( identical(Sys.getenv("USER"), "maechler") ) {
>>   foo(..)
>>   (z <- bar(..))
>>   summary(z)
>>   ....
>> }
>>
>> Now all the auto-printing is gone, and
>>
>> 1) I have to find out which of these function calls do autoprint and 
>> wrap
>>    a print(..) around these, and
>>
>> 2) the result is quite ugly (for an example on a help page etc.)
>>
>> What I would like in a future R, is to be able to simply wrap the "{
>> .. } above with an 'withAutoprint(.) :
>>
>> if( identical(Sys.getenv("USER"), "maechler") ) withAutoprint({
>>   foo(..)
>>   (z <- bar(..))
>>   summary(z)
>>   ....
>> })
>>
>> Conceptually such a function could be written similar to source() 
>> with an R
>> level for loop, treating each expression separately, calling eval(.) 
>> etc.
>> That may cost too much performnace, ... still to have it would be 
>> better than
>> not having the possibility.
>>
>> ----
>>
>> If you read so far, you'd probably agree that such a function
>> could be a nice asset in R,
>> notably if it was possible to do this on the fast C level of R's main
>> REPL.
>>
>> Have any of you looked into how this could be provided in R ?
>> If you know the source a little, you will remember that there's
>> the global variable  R_Visible  which is crucial here.
>> The problem with that is that it *is* global, and only available
>> as that; that the auto-printing "concept" is so linked to "toplevel 
>> context"
>> and that is not easy, and AFAIK not so much centralized in one place 
>> in the
>> source. Consequently, all kind of (very) low level functions 
>> manipulate R_Visible
>> temporarily.... and so a C level implementation of withAutoprint() may
>> need considerable more changes than just setting R_Visible to TRUE in 
>> one
>> place.
>>
>> Have any efforts / experiments already happened towards providing such
>> functionality ?
>
> I don't think the performance cost would matter.  If you're printing 
> something, you're already slow.  So doing this at the R level would 
> make most sense to me --- that's how Sweave and source and knitr do 
> it, so it can't be that bad.
>
> Duncan Murdoch
>
A C-level implementation would bring the benefit of a lean traceback() 
in case of an error. I suspect eval() could be enhanced to auto-print.

By the same token it would be extremely helpful to have a C-level 
implementation of local() which wouldn't litter the stack trace.


-Kirill



More information about the R-devel mailing list