Thanks! On 10/28/06, Duncan Murdoch <[EMAIL PROTECTED]> wrote: > On 10/26/2006 5:26 AM, Gabor Grothendieck wrote: > > 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!!!! > > I've just added this function to R-devel (to become 2.5.0 next spring): > > withVisible <- function(x) { > x <- substitute(x) > v <- .Internal(eval.with.vis(x, parent.frame(), baseenv())) > v > } > > Luke Tierney suggested simplifying the interface (no need to duplicate > the 3 parameter eval interface, you can just wrap this in evalq() if you > need that flexibility); the name "with.vis" was suggested, but it looks > like an S3 method for the with() generic, so I renamed it. > > Duncan Murdoch >
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel