On 10/26/06, Duncan Murdoch <[EMAIL PROTECTED]> wrote: > 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 > >
Perfect. Thanks!!!! ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel