Question Désactiver la commande de chat


Supposons que j'ai la fonction suivante:

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

Quand j'appelle f() est-il possible d'arrêter cat impression à l'écran (sans modifier la fonction de toute façon)?

Raison derrière cette question

Mes étudiants téléchargent leurs fichiers R. Je lance ensuite les scripts et vérifie s'ils sont corrects. De temps en temps, un étudiant part dans le cat commander. Ceci est particulièrement irritant quand il est dans une longue boucle


12
2018-03-15 10:30


origine


Réponses:


Sous Linux, vous pouvez utiliser un sink() appeler pour /dev/null(ou à un fichier temporaire sur un autre OS, voir ?tempfile):

sink(file="/dev/null")
f()
sink()

18
2018-03-15 10:41



Cela devrait fonctionner?

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

Juste remplacer cat avec un vide function, puis le remettre à la fin


4
2018-03-15 10:41



Voici un hack amusant qui commente tous les cat()est dans une fonction. Pas sûr si cela donne des erreurs ou casse la fonction si:

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

f()

[1] 1

Modifier:

Une autre option est essentiellement la réponse de Juba, en utilisant le récepteur, mais vous pouvez utiliser le Defaults package pour modifier le comportement par défaut de cat. le file L'argument coule essentiellement sa sortie dans un fichier. Alors :

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

f()

Assure que seule la sortie de cat et pas print ou alors est coulé. Cependant, cela réduit considérablement le temps d'exécution depuis qu'un fichier est maintenant ouvert et fermé à chaque fois cat() est exécuté


2
2018-03-15 11:18



capture.output() avec invisible() fait ce que tu veux:

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

Cela fonctionne aussi:

f2 <- function() {
    tmp <- tempfile()
    sink(tmp)
    on.exit(sink())
    on.exit(file.remove(tmp), add = TRUE)
    invisible(force(f())) 
}
x <- f2()

1
2017-12-29 12:16