2017-08-15 1 views
-1

En développant un paquet R, je voudrais utiliser R 's message() ou warning() fonctions pour produire la sortie pour mon utilisateur de paquet.Comment formatez-vous les messages du paquet R multiligne?

Parfois, ces messages peuvent être longs. Je peux le faire (le texte est tout exemple trivial):

message("If you got to this point in the code, it means the matrix was empty. Calculation continues but you should consider re-evaluating an earlier step in the process") 

Grande ... Mais pour le style, je veux aussi que mes lignes de code à moins de 80 caractères, ils se rangent bien dans les écrans étroits , sur GitHub, etc. Et puis je peux utiliser un outil de refusion de code IDE pour reformater mon message facilement s'il change.

J'essayez ceci:

message("If you got to this point in the code, it means 
the matrix was empty. Calculation continues but you should consider 
re-evaluating an earlier step in the process") 

Cela résout mes critères de code - il est inférieur à 80 lignes de caractères et peut refusion comme prévu. Mais qui colle le droit des espaces dans ma sortie de message, que je ne veux pas non:

If you got to this point in the code, it means 
the matrix was empty. Calculation continues but you should consider 
re-evaluating an earlier step in the process 

Je trouve cette fonction pratique appelée strwrap() qui semble résoudre le problème:

message(strwrap("If you got to this point in the code, it means 
the matrix was empty. Calculation continues but you should consider 
re-evaluating an earlier step in the process")) 

sortie:

If you got to this point in the code, it means the matrix was empty. 
Calculation continues but you should considerre-evaluating an earlier 
step in the process 

l'air bien - mais il a éliminé l'espace entre « considérer » et « réévaluer » parce que l'espace était à une nouvelle ligne.

Une autre alternative est de le casser en morceaux dans le code:

message("If you got to this point in the code, it means ", 
"the matrix was empty. Calculation continues but you should consider ", 
"re-evaluating an earlier step in the process") 

Cela rend la REGARDEZ correcte, mais le texte ne peut plus refusion facilement avec IDE, etc, parce que ce n'est pas une chaîne, donc cela ne fonctionne pas pour moi du côté des développeurs. Donc, comment puis-je faire un message bien formaté qui me permet d'écrire le message facilement à travers les lignes?

J'ai écrit cette fonction:

.nicemsg = function(...) { 
    message(paste(strwrap(...), collapse="\n")) 
} 

Y at-il une meilleure façon en utilisant un haut-donc je n'ai pas inclure cette fonction dans chaque paquet de R j'écris?

+2

'un message ne fait (strwrap (..., prefix = "", initial = "")) 'fais ce dont tu as besoin? – Benjamin

+0

@Benjamin Oui, merci. Malheureusement, il n'est pas beaucoup plus concis que ma fonction, donc je vais toujours besoin de l'envelopper ... – nsheff

+0

@Benjamin puisqu'il n'y a pas eu d'autres réponses, si vous postez cela comme une réponse, je vais l'accepter. – nsheff

Répondre

1

En utilisant deux arguments plus de strwrap rend possible

message(strwrap(..., prefix = " ", initial = "")) 

Vous pourriez être en mesure d'améliorer la lisibilité en jouant avec l'ordre des arguments. Je ne suis pas sûr que ce soit meilleur ou non.

message(strwrap(prefix = " ", initial = "", 
    "If you got to this point in the code, it means 
the matrix was empty. Calculation continues but you should consider 
re-evaluating an earlier step in the process")) 

Ou, si vous préférez l'envelopper

tidymess <- function(..., prefix = " ", initial = ""){ 
    message(strwrap(..., prefix = prefix, initial = initial)) 
} 
+1

J'aime particulièrement le nom de la fonction 'tidymess'. C'est aussi comme ça que je décrirais mon bureau. – nsheff

-1

Vous pouvez forcer des sauts de ligne en ajoutant \n dans la chaîne.

message("If you got to this point in the code,\nit means the matrix was empty.\nCalculation continues but you should consider re-evaluating\nan earlier step in the process") 
# If you got to this point in the code, 
# it means the matrix was empty. 
# Calculation continues but you should consider re-evaluating 
# an earlier step in the process 
+0

Cela ne résout ni le problème de refusion IDE ni la limite de 80 caractères. Veuillez relire la question s'il vous plaît. – nsheff

+0

Dans quelles conditions voulez-vous que le code se rediffuse? –

+0

euh, dans toutes les conditions? Et oui; cela s'étend encore trop loin comme dans mon premier exemple. Le point semble peu clair: le code doit contenir 80 caractères. vos suggestions n'emballent pas le code à 80 caractères (permettant à l'EDI de refaire le code). – nsheff