2010-04-21 6 views
4

J'écris un document Sweave, et je veux inclure une petite section qui détaille les versions R et paquet, platofrms et combien de temps ti a pris pour évaluer le document, cependant, je veux mettre ceci au milieu du document ! J'utilisais un \ Sexpr {elapsed} pour faire ceci (qui ne fonctionnait pas), mais si je mettais l'impression de code dans un morceau qui s'évalue à la fin, je pourrais alors inclure le morceau à mi-chemin à travers, qui échoue également.Est-il possible d'inclure un Sexpr avant que l'expression ait été évaluée dans Sweave/R?

Mon document de ressemble à ce

% 
\documentclass[a4paper]{article} 
\usepackage[OT1]{fontenc} 
\usepackage{longtable} 
\usepackage{geometry} 
\usepackage{Sweave} 
\geometry{left=1.25in, right=1.25in, top=1in, bottom=1in} 
\begin{document} 

<<label=start, echo=FALSE, include=FALSE>>= 
startt<-proc.time()[3] 
@ 
Text and Sweave Code in here 
% 
This document was created on \today, with \Sexpr{print(version$version.string)} running 
on a \Sexpr{print(version$platform)} platform. It took approx sec to process. 
<<>>= 
    <<elapsed>> 
@ 
More text and Sweave code in here 
<<label=bye, include=FALSE, echo=FALSE>>= 
odbcCloseAll() 
endt<-proc.time()[3] 
elapsedtime<-as.numeric(endt-startt) 
@ 
<<label=elapsed, include=FALSE, echo=FALSE>>= 
print(elapsedtime) 
@ 
\end{document} 

Mais cela ne semble pas fonctionner (étonnamment!)

Est-ce que quelqu'un sait comment je pourrais le faire?

Merci

Paul.

Répondre

3

Cela fonctionne très bien pour moi:

\documentclass{article} 
\usepackage{Sweave} 
\begin{document} 

<<label=start, echo=FALSE, include=FALSE>>= 
startt<-proc.time()[3] 
@ 

Text and Sweave Code in here 

This document was created on \today, with 
\Sexpr{print(version$version.string)}. 

<<results=hide,echo=FALSE>>= 
Sys.sleep(2) # instead of real work 
@ 

More text and Sweave code in here 

<<label=bye, include=FALSE, echo=FALSE>>= 
endt<-proc.time()[3] 
elapsedtime<-as.numeric(endt-startt) 
@ 

It took approx \Sexpr{elapsedtime} seconds to process. 

\end{document} 

je devais enlever la chaîne de version dans la \Sexp{} que je reçois un trait de soulignement avec par x86_64 qui bouscule alors LATEX. Sinon, tout va bien, et vous obtenez maintenant le temps écoulé juste au-dessus du montant dormi.

Vous pouvez utiliser R pour mettre en cache le temps écoulé dans un fichier temporaire pour la prochaine exécution, ou le passer à LaTeX comme une sorte de variable - mais vous ne pourrez pas utiliser 'forward references' comme R les morceaux sont évalués à leur tour.

2

BTW vous ne devez généralement imprimer pour évaluer les variables R

\Sexpr{version$version.string} 

fonctionne bien et

2

La réponse de Dirk est presque parfait, mais ne fonctionne toujours vous laissez pas mettre la voie de réponse à mi-parcours le document. Je me suis senti frustré de penser que cela devrait fonctionner, mais j'ai réalisé que le code que j'avais était ouvrir le fichier de temps au début de chaque cycle (et le vider) et écrire le résultat vide dans mon document, puis mettre la réponse dans le fichier la fin !

J'ai finalement fait quelque chose de similaire mais en utilisant R pour ouvrir et écrire le fichier à la fin, ce qui a bien fonctionné!

\documentclass[a4paper]{article} 
\usepackage[OT1]{fontenc} 
\usepackage{longtable} 
\usepackage{geometry} 
\usepackage{Sweave} 
\geometry{left=1.25in, right=1.25in, top=1in, bottom=1in} 
\begin{document} 

<<label=start, echo=FALSE, include=FALSE>>= 
startt<-proc.time()[3] 
@ 
Text and Sweave Code in here 
% 
This document was created on \today, with \Sexpr{print(version$version.string)} running 
on a \Sexpr{print(version$platform)} platform. It took approx \input{time} 
sec to process. 

More text and Sweave code in here 
<<label=bye, include=FALSE, echo=FALSE>>= 
odbcCloseAll() 
endt<-proc.time()[3] 
elapsedtime<-as.numeric(endt-startt) 
@ 
<<label=elapsed, include=FALSE, echo=FALSE>>= 
fileConn<-file("time.tex", "wt") 
writeLines(as.character(elapsedtime), fileConn) 
close(fileConn) 
@ 
\end{document} 
Questions connexes