tags:

views:

110

answers:

4

In R some functions can print information and return values, can the print be silenced?

For example:

print.and.return <- function() {
  print("foo")
  return("bar")
}

returns

> print.and.return()
[1] "foo"
[1] "bar"
> 

I can store the return like:

> z <- print.and.return()
[1] "foo"
> z
[1] "bar"
> 

Can I suppress the print of "foo"?

+7  A: 
?capture.output
hadley
Nice, so in my example: dev.nil <- capture.output(z <- print.and.return()) does the trick.
ayman
+3  A: 

If you absolutely need the side effect of printing in your own functions, why not make it an option?

print.and.return <- function(..., verbose=TRUE) {
  if (verbose) 
    print("foo")
  return("bar")
}


> print.and.return()
[1] "foo"
[1] "bar"
> print.and.return(verbose=FALSE)
[1] "bar"
> 
Vince
Nice use of a default; the issue is that it's not my function.
ayman
+4  A: 

You may use hidden functional nature of R, for instance by defining function

deprintize<-function(f){
 return(function(...) {capture.output(w<-f(...));return(w);});
}

that will convert 'printing' functions to 'silent' ones:

noisyf<-function(x){
 print("BOO!");
 sin(x);
}

noisyf(7)
deprintize(noisyf)(7)
deprintize(noisyf)->silentf;silentf(7)
mbq
`quiet` might be a better name for that function...
hadley
@hadley boring!
mbq
+3  A: 

I agree with hadley and mbq's suggestion of capture.output as the most general solution. For the special case of functions that you write (i.e., ones where you control the content), use message rather than print. That way you can suppress the output with suppressMessages.

print.and.return2 <- function() {
  message("foo")
  return("bar")
}

# Compare:
print.and.return2()
suppressMessages(print.and.return2())
Richie Cotton