Disabling the cat command

后端 未结 5 1223
别跟我提以往
别跟我提以往 2020-12-16 15:16

Suppose I have the following function:

## Just an example
f = function() { 
  for(i in 1:10000)
      cat(i)
  return(1)
}

When I call

相关标签:
5条回答
  • 2020-12-16 15:22

    This should work?

    oldcat = cat
    cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
    f()
    cat = oldcat
    

    Just replace cat with an empty function, and then set it back on completion

    0 讨论(0)
  • 2020-12-16 15:28

    Here is a funny hack that comments out all the cat()'s in a function. Not sure if this gives errors or breaks the function though:

    foo <- deparse(f)
    f <- eval(parse(text=gsub("cat","#cat",foo)))
    
    f()
    
    [1] 1
    

    Edit:

    Another option is basically Juba's answer, using sink, but you can use the Defaults package to change the default behavior of cat. The file argument basically sinks its output in a file. So :

    library("Defaults")
    setDefaults(cat,file="sink.txt")
    
    f()
    

    Ensures that only output of cat and not print or so is sinked. However, this drastically reduces the runtime since now a file is opened and closed everytime cat() is run.

    0 讨论(0)
  • 2020-12-16 15:29

    capture.output() with invisible() does what you want:

    f <- function() {
        cat("Hello")
        return(TRUE)
    }
    f1 <- function() {
        invisible(capture.output(f()))
    }
    x <- f1()
    

    This also works:

    f2 <- function() {
        tmp <- tempfile()
        sink(tmp)
        on.exit(sink())
        on.exit(file.remove(tmp), add = TRUE)
        invisible(force(f())) 
    }
    x <- f2()
    
    0 讨论(0)
  • 2020-12-16 15:36

    On Linux, you can use a sink() call to /dev/null(or to a temporary file on another OS, see ?tempfile) :

    sink(file="/dev/null")
    f()
    sink()
    
    0 讨论(0)
  • 2020-12-16 15:46

    The function quietly() from the purrr library creates a quiet version of a function:

    library(purrr)
    f <- function() {
        cat("Hello")
        return(TRUE)
    }
    f2 <- quietly(f)
    f2()
    #> $result
    #> [1] TRUE
    #> 
    #> $output
    #> [1] "Hello"
    #> 
    #> $warnings
    #> character(0)
    #> 
    #> $messages
    #> character(0)
    
    0 讨论(0)
提交回复
热议问题