Можно ли включить Sexpr до того, как выражение будет оценено в Sweave / R? - PullRequest
4 голосов
/ 21 апреля 2010

Я пишу документ Sweave и хочу включить небольшой раздел, в котором подробно описываются версии R и пакетов, платформы и время, затрачиваемое на оценку документа, однако я хочу поместить его в центр документ!

Я использовал \ Sexpr {elapsed}, чтобы сделать это (что не сработало), но подумал, что если я помещу печать кода, прошедшую в блок, который оценивается в конце, я мог бы затем включить блок на полпути через , что тоже не получается.

Мой документ выглядит примерно так

% 
\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}

Но, похоже, это не работает (удивительно!)

Кто-нибудь знает, как я мог это сделать?

Спасибо

Paul.

Ответы [ 3 ]

3 голосов
/ 21 апреля 2010

Это прекрасно работает для меня:

\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}

Мне пришлось удалить строку версии внутри \Sexp{}, так как я получаю подчеркивание через x86_64, что затем расстраивает LaTeX. В противном случае все в порядке, и вы получите истекшее время чуть больше количества сна.

Вы можете использовать либо R для кэширования прошедшего времени во временном файле для следующего запуска, либо передать его в LaTeX в качестве некоторой переменной - но вы не сможете использовать «прямые ссылки» в качестве блоков R оценивается по очереди.

2 голосов
/ 23 апреля 2010

Ответ Дирка почти идеален, но все же не позволяет вам поставить ответ на полпути в документе. Я разочаровался, подумав, что это должно сработать, но понял, что код, который я открывал файл времени в начале каждого прогона (и очищал его) и записывал пустой результат в мой документ, а затем помещал ответ в файл времени в конец!

В конце концов я сделал что-то похожее, но с помощью R открывал и записывал только файл в конце, что отлично работало!;

\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}
2 голосов
/ 21 апреля 2010

Кстати, для оценки переменных вам обычно не нужна печать R

\Sexpr{version$version.string}

также отлично работает

...