[Rd] type="message" possibility for capture.output() ?

Ben Bolker bbolker at gmail.com
Sun Sep 22 19:03:45 CEST 2013


  As far as I can tell, there's no built-in way to get
capture.output() to capture messages (stderr) instead of
stdout ... suggested, fairly trivial, patch below.

f <- function() {
    message("abc")
    cat("def\n")
}

x <- capture.output(f())
## prints 'abc'
x ## value: "def"

source("~/R/r-devel/src/library/utils/R/capture.output.R")
x <- capture.output(f()) ## unchanged
x <- capture.output(f(),type="message") ## prints 'def': value 'abc'

   Of course, if someone was going to mess with this function more,
it might be nice to have an option to have *both* streams captured ...

Index: capture.output.R
===================================================================
--- capture.output.R	(revision 63969)
+++ capture.output.R	(working copy)
@@ -16,8 +16,10 @@
 #  A copy of the GNU General Public License is available at
 #  http://www.r-project.org/Licenses/

-capture.output <- function(..., file=NULL, append=FALSE)
+capture.output <- function(..., file=NULL, append=FALSE,
+                           type = c("output", "message"))
 {
+    type <- match.arg(type)
     args <- substitute(list(...))[-1L]

     rval <- NULL; closeit <- TRUE
@@ -31,9 +33,9 @@
     } else
         stop("'file' must be NULL, a character string or a connection")

-    sink(file)
+    sink(file,type=type)
     ## for error recovery: all output will be lost if file=NULL
-    on.exit({sink(); if(closeit) close(file)})
+    on.exit({sink(type=type); if(closeit) close(file)})

     pf <- parent.frame()
     evalVis <- function(expr)
@@ -50,7 +52,7 @@
     }
     ## we need to close the text connection before returning 'rval'
     on.exit()
-    sink()
+    sink(type=type)
     if(closeit) close(file)
     if(is.null(rval)) invisible(NULL) else rval
 }



More information about the R-devel mailing list