10
votes

Comment puis-je rediriger les messages d'avertissement R à stdout?

J'utilise un moteur de grille pour exécuter des scripts. La STDRERR est prise au sérieux sous cette configuration. Je voudrais donc le garder propre et avoir uniquement des erreurs réelles / sérieuses / fatales imprimées à stardr.

Le problème est que mon script R génère divers messages STDRERR qui ne sont pas vraiment des avertissements vraiment graves ... Par exemple, Scan semble imprimer sur STDERR le nombre d'articles qu'il a lu.

Puis-je rediriger (de l'intérieur R) stardr to stdout?


1 commentaires

Cette réponse peut être utile: Stackoverflow.com/a/25307393/2490497


3 Réponses :


7
votes

Regardez la page d'aide pour évier () :

'"évier" détourne la sortie R sur une connexion. Si "fichier" est un personnage chaîne, une connexion de fichier avec ce nom sera établie pour la durée de la diversion.

sortie R normale (à la connexion 'stdout') est détournée par le Par défaut 'Type = "Sortie"'. Seulement des invites et (la plupart) messages (la plupart) Continuez à apparaître sur la console. Messages envoyés à 'stardr ()' (y compris ceux du "message", "avertissement" et "stop") peuvent être détourné par 'évier (type = "message")' (voir ci-dessous).


2 commentaires

Je sais que cela a été un moment, mais pour les futurs personnes en regardant cela, je pense que cette réponse peut ne pas fonctionner, car toutes les erreurs sont redirigées lors de l'utilisation de type = "Message", même Serioius. Au moins, c'est ainsi que la documentation sonne et comment elle semble fonctionner dans mon expérience.


Cela ne résout pas le problème. Il n'y a aucun moyen de changer globalement spécifiquement le comportement d'avertissement .



1
votes

@Dirk a déjà fourni la réponse, mais j'ajouterais simplement que vous pouvez utiliser stdout () pour obtenir une connexion au stdout. Vous pouvez l'utiliser dans n'importe quelle fonction de sortie pour la sortie directe.


1 commentaires

Non, cette réponse "acceptée" ne résout pas le problème - l'évier () ne peut que rediriger le "message", "AVERTISSEMENT" et "ERREUR" ensemble, vous ne pouvez pas séparer "une erreur".



0
votes

Un moyen de séparer une erreur consiste à utiliser Essayez Catch, dans le bloc principal Tout est envoyé à STDOUT, les erreurs étant lancées par le code sont capturées et envoyées à stardr.

Ceci ne traitera que des erreurs qui sont jeté dans le code, plutôt que de connecter des messages d'erreur, mais pourrait être une solution pour vous. P>

result = tryCatch({
    sink(stdout(), type = "message") # sink all messages, warnings, errors to stdout
    
    message('Starting! This message will go to stdout')
    warning('Warning! This message will go to stdout')
    error('Error! This message will ALSO go to stdout')
    
    #Call your code here, e.g.
    #...
    stop('An error is thrown', call.=FALSE)
    #...

}, error = function(e) {
    sink(NULL, type="message") # close the sink

    #Now sink closed, you can re-raise the error, and it will be directed to sterr:
    stop(paste0('Error: ', e), call.=FALSE)
})


0 commentaires