[Rd] how to determine if a function's result is invisible
Duncan Murdoch
murdoch at stats.uwo.ca
Thu Oct 26 06:11:13 CEST 2006
On 10/25/2006 11:02 PM, Gabor Grothendieck wrote:
> On 10/25/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
>> On 10/25/2006 8:14 PM, Gabor Grothendieck wrote:
>>> Suppose we have a function such as the following
>>>
>>> F <- function(f, x) f(x)+1
>>>
>>> which runs function f and then transforms it. I would like the
>>> corresponding function which works the same except that
>>> unlike F returns an invisible result if and only if f does.
>>>
>>> Is there some way of determining whether f returns
>>> an invisible result or not?
>>>
>>> Thus we want this:
>>>
>>> f <- function(x) x
>>> g <- function(x) invisible(x)
>>>
>>>> F(f, 1)
>>> 2
>>>
>>>> F(g, 1)
>> I don't think there's a way to do that. Internally there's a global
>> flag called R_Visible; if it is set to zero, the value won't print. But
>> it gets reset to 1 very easily (e.g. by adding 1 to the result of an
>> invisible function), and it's not available in the API for you to write
>> C code to look at it.
>>
>> I think you'll just have to do require the user of your F to tell you
>> that they want the result to be invisible.
>>
>> Duncan Murdoch
>>
>
> Perhaps R_Visible be made available at the R level in the future.
> It would be helpful in situations where you are transforming a
> function but want to keep aspects of it such as whether the
> return result is invisible.
Actually, there is a way, but it's undocumented (i.e., use at your own
risk). It's the eval.with.vis function. This is an internal function
that is used within source() and capture.output(); you'll have to guess
from the usage there what the args are. But here's an F that does
something close to what you want:
> fix(F)
> f <- function() 1
> g <- function() invisible(1)
>
> F <- function (expr)
+ {
+ expr <- substitute(expr)
+ pf <- parent.frame()
+ tmp <- .Internal(eval.with.vis(expr, pf,
+ baseenv()))
+ tmp
+ }
> F(f())
$value
[1] 1
$visible
[1] TRUE
> F(g())
$value
[1] 1
$visible
[1] FALSE
More information about the R-devel
mailing list