2017-07-15 1 views
0

Ok, supposons que je crée un histogramme très simple avec ma fonction:Dans R, puis-je changer le titre de l'histogramme sans spécifier `main =`?

hist(my.fun(100)) 

Le titre de mon show histogramme Histogram of my.fun(100). C'est parfaitement bien pour moi! J'aime la façon dont R reconnaît automatiquement my.fun(100) et le place dans le titre et l'étiquette.

Mais je fais le calcul complexe, dit:

n <- my.complex.algo.that.compute.size(args) 
hist(my.fun(n)) 

Cette fois, le titre montrent Histogram of my.fun(n). Ce qui ne donne aucune indication sur la taille de n. Je sais que n sera évalué à un nombre entier, supposons que pour cette exécution n == 42, j'aime voir le titre de l'histogramme afficher Histogram of my.fun(42) à la place.

Est-ce possible sans en spécifiant le titre par moi-même (pas main=paste(...)). J'ai essayer ces et ne parviennent:

hist(my.fun(`n`)) 
hist(my.fun(eval(n))) 
+6

« Comment puis-je faire quelque chose en R sans utiliser la argument qui est fourni pour faire exactement cela? " est une question très étrange. Évidemment, vos tentatives échouent. Sur la page d'aide de 'hist', il est dit que vous changez le titre avec l'argument' main'. Si vous n'aimez pas cela, vous écrivez votre propre fonction hist qui fait ce que vous voulez. –

+2

Peut-être que nous serions moins perplexes si vous expliquez pourquoi? En particulier, "(pas de main = coller (...))", pourquoi? – rosscova

+0

Je trouve que R a un aspect d'évaluation très étrange (comparé à d'autres langages à usage général tels que C, Python). Pour celui-ci, je suis curieux de savoir pourquoi 'hist()' peut attraper l'expression 'my.fun (100)' et en faire une chaîne dans le titre plus tard! – neizod

Répondre

0

Après je regarde et apprends à partir hist code source, je peux dire que cela est impossible quand hist est appelé haut niveau de la fonction. En raison de cette ligne dans le code source:

xname <- paste(deparse(substitute(x), 500), collapse = "\n") 

L'arbre d'expression essayer d'attraper deparse(substitute(x)) (non encore évalué) et la transformer en une chaîne. Cela signifie que quelle que soit l'expression que je tape comme premier argument pour la fonction hist, elle sera immédiatement transformée en chaîne sans aucune évaluation. Pour ce faire, j'ai besoin de forcer l'évaluation à une feuille de l'arbre d'expression. Ce qui (heureusement assez que je viens d'apprendre à ce sujet) peut être fait avec substitute et utiliser do.call pour passer l'arbre d'expression évalué comme argument pour hist fonction:

n <- my.complex.algo.that.compute.size(user.args) # suppose this calc return 42 
evaluated.arg <- substitute(my.fun(x), list(x=n)) # now this will be my.fun(42) 
do.call(hist, list(evaluated.arg)) 
3

Si vous restreignez la chose que vous êtes à une fonction d'histogramme d'un seul argument, n, alors vous pouvez faire ceci:

nhist = function(f,n){ 
    hist(f(n), 
    main=paste0(
    "Histogram of ", 
    deparse(substitute(f), 500)," 
    (",n,")", collapse = "\n"))} 

que vous appelez légèrement autrement:

Z=100 
nhist(runif, Z) 

Vous devez passer f et n séparément car il n'y a aucun moyen hist peut comprendre ce qui a été passé à f.