2017-06-25 1 views
5

Lors de l'écriture de diapositives de cours par exemple, nous rencontrons très souvent une situation où nous souhaitons avoir une sortie de code en ligne source code = result. Ainsi, par exempleKnitr: Afficher le code source de blocs de code en ligne

"foofoofoo qt(p = 0.95, df = 24) = 1.710882 barbarbar" 

Mais \Sexpr{qt(p = 0.95, df = 24)} ne fournit que la deuxième partie de cette sortie. L'une des quelques solutions de contournement est

\Sexpr{highr::hi_latex('qt(p = 0.95, df = 24)')} $=$ \Sexpr{qt(p = 0.95, df = 24)} 

ce qui est un peu inconfortable à utiliser.

Question 1: Existe-t-il une autre solution?

Question 2:

Le crochet en ligne ne nous permet de changer la mise en forme du résultat de l'évaluation (alors comment doit être affiché au-dessus du 1.710882).

Serait-il possible de rendre le code source en \Sexpr{} disponible en option dans le crochet en ligne? Ensuite, je pourrais facilement définir la sortie en ligne à source = result.

Répondre

4

Je suppose qu'il est possible d'obtenir ce que vous voulez en modifiant les crochets, mais seulement modifier le hook en ligne ne suffit pas, puisque le seul argument passé au hook inline est déjà le résultat évalué et aucun autre argument. Et modifier beaucoup de crochets est trop risqué et ne vaut pas le coup. Voici quelque chose qui réalise ce que vous voulez avec peu d'effort. Par exemple, vous pouvez définir la fonction suivante s dans votre morceau de configuration knitr:

s <- function(x){ 
    paste0(deparse(substitute(x)), " = ", x) 
} 

Et vous pouvez utiliser quelque chose comme r s(qt(p = 0.95, df = 24)) ou \Sexpr{s(qt(p = 0.95, df = 24))} pour obtenir le résultat souhaité.

Edit: d'une manière plus sophistiquée peut être:

s <- function(x){ 
    paste0(deparse(substitute(x)), " = ", knitr::knit_hooks$get("inline")(x)) 
} 

Cette version de s donnera vos résultats numériques arrondis comme le crochet en ligne par défaut. Editer: Grâce à @ user2554330, je change deparse(sys.call()[[2]] en deparse(substitute(x)) en suivant un langage plus commun.

+0

Merci! Je n'ai pas pensé à utiliser l'historique des appels. C'est certainement beaucoup mieux que tout ce que j'ai vu et essayé jusqu'à présent. –

+0

Un langage R commun plus commun est 'deparse (substitut (x))' plutôt que 'deparse (sys.call() [[2]]'. – user2554330

+0

@ user2554330 Merci beaucoup, j'apporte la modification correspondante à ma réponse – Consistency