Yes, with the old good cat() and results=tex, you can do anything. It is just so unnatural. Why must a simple task like setting the size of a plot involve with so much coding work?
% complete knitr code <<setup, include=FALSE>>= opts_knit$set(eval.opts = c('fig.height', 'fig.width')) my.height = 6; my.width = 7 @ <<use-my-size, fig.height=my.height, fig.height=my.height, out.width=.8\textwidth>>= plot(rnorm(100)) @ No cats are involved here. Besides, cat() is hard-coded; you have to remember to change the filename when your label is changed, and I do not mind writing pdf()/dev.off() once, but what if I have a hundred plots in the document -- five hundred cats jumping around? And you also want to hide them in the backyard so the readers won't see them. Regards, Yihui -- Yihui Xie <xieyi...@gmail.com> Phone: 515-294-2465 Web: http://yihui.name Department of Statistics, Iowa State University 2215 Snedecor Hall, Ames, IA On Mon, Feb 20, 2012 at 3:34 PM, Marc Schwartz <marc_schwa...@me.com> wrote: > On Feb 20, 2012, at 9:15 AM, BXC (Bendix Carstensen) wrote: > >> Sometimes you want to compute the physical size of a plot based on data. >> In R itself this is no problem. >> >> But is there a way to compute the values of height and width in S-weave, say: >> >> <<graph,fig=TRUE,height=xx,width=yy>>= >> >> where xx and yy are computed and not physically written in the document? >> >> Bendix > > Bendix, > > By default, Sweave.sty sets: > > \setkeys{Gin}{width=0.8\textwidth} > > which modifies the default \includegraphics LaTeX command auto-generated > during Sweave processing. This means that irrespective of the 'height' and > 'width' arguments in the figure chunk header, which do control the size of > the PDF/EPS files created, the actual size of the graphic as included in the > resultant document will ALWAYS be 80% of the current text width and the > height will be scaled accordingly. > > In general, if you wanted to control the actual height and width of the > figure in the resultant document, you could set: > > <<FigureChunkName,include=false,echo=false,fig=true,height=YourHeight,width=YourWidth>>= > > Plot Code Here > > @ > > \begin{figure}[tbp] > \centering > \includegraphics{RnwFileName-FigureChunkName} > \caption[LOF Caption]{Some Longer Caption} > \end{figure} > > 'RnwFileName' is the name of your working .Rnw Sweave file and > 'FigureChunkName' is the name of the figure chunk and as a result, the > graphic file name being created by Sweave, separated by the hyphen ('-'). > > By setting the 'include' option to false, Sweave does not auto-generate the > \includegraphics line with the "width=0.8\textwidth" argument, and you then > explicitly include it in the LaTeX code following the figure chunk. The plot > file(s) would then be created with the height and width parameters in the > figure chunk header and the resultant document will have a figure of the size > you desire, overriding the default behavior. > > In my .Rnw files, I actually set: > > \usepackage[nogin]{Sweave} > > in my preamble, which overrides the default 'Gin' behavior. Then the height > and width parameters in the figure chunks are reflected in the resultant > document, but of course, I need to explicitly pre-define those. > > If you want to calculate the figure's height and width at run-time, I suspect > that the only way to do that would be to have your R code generate all of the > LaTeX code output at runtime as well. So something like the following: > > <<CodeChunkName,echo=false>>= > > # Plot Size Calculations Here > Height <- ResultOfCalcs > Width <- ResultOfCalcs > > pdf("MyPlotFileName.pdf", height = Height, width = Width) > > Plot Code Here > > dev.off() > > cat("\\begin{figure}[tbp]\n") > cat("\\centering\n") > cat("\\includegraphics{MyPlotFileName}\n") > cat("\\caption[LOF Caption]{Some Longer Caption}\n") > cat("\\end{figure}\n") > > @ > > > The result of the cat() function calls will be to output the included > character vectors to the .tex file being created by Sweave at run-time. So > you are using R in a normal code chunk to generate LaTeX code. > > If you need an EPS file either in place of the PDF (because you are using > postscript stuff like pstricks) or in addition to the PDF, you can replace > the pdf() call with postscript() or run a second iteration of the plotting > code using postscript()/dev.off() as well. > > HTH, > > Marc Schwartz > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.