Dear Duncan, Thanks for this -- it'll enable me to get rid of a list of functions returning invisible output that the Rcmdr maintains.
Regards, John -------------------------------- John Fox Department of Sociology McMaster University Hamilton, Ontario Canada L8S 4M4 905-525-9140x23604 http://socserv.mcmaster.ca/jfox -------------------------------- > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Duncan Murdoch > Sent: Saturday, October 28, 2006 12:13 PM > To: Gabor Grothendieck > Cc: Luke Tierney; Martin Maechler; R Development Mailing List > Subject: Re: [Rd] how to determine if a function's result is invisible > > 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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel