Gabor Grothendieck
2006-Oct-26 00:14 UTC
[Rd] how to determine if a function's result is invisible
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) >
Marc Schwartz
2006-Oct-26 01:20 UTC
[Rd] how to determine if a function's result is invisible
On Wed, 2006-10-25 at 20:14 -0400, 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) > >Gabor, There may be a better way of doing this and/or this will spark some thoughts. Let's create two simple functions: f.inv <- function(x) {invisible(x)} f <- function(x) {x} So we now have:> f.inv(1) > f(1)[1] 1> any(grep("invisible", (deparse(f))))[1] FALSE> any(grep("invisible", (deparse(f.inv))))[1] TRUE This is not extensively tested of course, but another function that comes to mind that does return a result 'invisibly' is:> any(grep("invisible", (deparse(barplot.default))))[1] TRUE So there seems to be some foundation for working, as long as the target function can be deparsed, which may limit things with respect to C/FORTRAN based functions. HTH, Marc Schwartz
Duncan Murdoch
2006-Oct-26 02:56 UTC
[Rd] how to determine if a function's result is invisible
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