On 10/25/2006 11:02 PM, Gabor Grothendieck wrote: > On 10/25/06, Duncan Murdoch <[EMAIL PROTECTED]> 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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel