est-il possible de rediriger la sortie de la console vers une variable?

Dans R, je me demande s'il est possible de rediriger temporairement la sortie de la console vers une variable?

P. s. Il y a quelques exemples sur le web sur la façon d'utiliser sink() rediriger la sortie dans un fichier, mais aucun que j'ai pu trouver en montrant comment rediriger dans une variable.

P. P. s. La raison pour laquelle cela est utile, en pratique, est que j'ai besoin d'imprimer une partie de la sortie de la console par défaut à partir de certaines des fonctions intégrées dans R.

28
demandé sur Ben Bolker 2013-05-03 15:59:21

2 réponses

Je crois que results <- capture.output(...) est ce dont vous avez besoin (c'est-à-dire en utilisant l'argument par défaut file=NULL). sink(textConnection("results")); ...; sink() devrait aussi fonctionner, mais comme le dit ?capture.output, capture.output() est:

Lié à 'sink’ de la même manière que 'with' est lié à 'attach'.

... ce qui suggère que capture.output() sera généralement meilleur car il est plus Contenu (c'est-à-dire que vous n'avez pas à vous rappeler de terminer le sink()).

Si vous souhaitez envoyer la sortie de plusieurs instructions à une variable, vous pouvez les envelopper dans curly crochets {}, mais si le bloc est suffisamment complexe, il pourrait être préférable d'utiliser sink() (ou de rendre votre code plus modulaire en l'enveloppant dans des fonctions).

29
répondu Ben Bolker 2016-10-27 18:20:46

Pour l'enregistrement, il est en effet possible de stocker stdout dans une variable à l'aide d'une connexion temporaire sans appeler capture.output - par exemple lorsque vous voulez enregistrer les résultats et stdout. Exemple:

  1. Préparer la variable pour la sortie R déviée:

    > stdout <- vector('character')
    > con    <- textConnection('stdout', 'wr', local = TRUE)
    
  2. Détourner la sortie:

    > sink(con)
    
  3. Faites quelques trucs:

    > 1:10
    
  4. Fin du détournement:

    > sink()
    
  5. Fermez le connexion:

    > close(con)
    
  6. Résultats de vérification:

    > stdout
    [1] " [1]  1  2  3  4  5  6  7  8  9 10"
    
11
répondu daroczig 2014-12-12 13:11:34