[Bioc-devel] To use knitr, how to write the right Makefile for bioconductor devel and released branch?
On Sat, Oct 6, 2012 at 12:27 PM, Dan Tenenbaum <dtenenba at fhcrc.org> wrote:
On Fri, Oct 5, 2012 at 9:52 AM, Tengfei Yin <yintengfei at gmail.com> wrote:
Hi Here is a following up question about knitr used in Bioconductor, please check the released version here http://www.bioconductor.org/packages/2.11/bioc/html/ggbio.html many of them are just pdf figures, only one of them is the vignette, but I set knitr like this opts_chunk$set(fig.path='./figures/ggbio-', fig.align='center', fig.show='asis') so it should put all the figure under ./figures subdirectory. I guess it's because when sweave running first time, it's produce some graphics and not removed when building the package? Is there a way to remove those pdf which are not vignettes under /inst/doc, and also remove extra pdf under ./figures subdirectory, this will make package too large.
I don't think there's a way to keep those files out of the source tarball, which should contain in it everything needed to build the package, even if it already contains a build vignette. However, these files will not show up in either the installed package or the mac and windows binary package.
Let me correct myself on this. The files will show up in the installed package and binary packages, but not if you add a file called .Rinstignore to the top level directory of your package, with the contents: inst/doc/figures This is documented in the "writing extensions" manual. Dan
I am putting something like
%.pdf: %.Rnw
rm -f *.pdf
$(R_HOME)/bin/Rscript -e "library(knitr); knit2pdf('$*.Rnw')"
it caused error in windows built like
rm -f *.pdf
rm: cannot remove `Rplots.pdf': Device or resource busy
make: *** [ggbio.pdf] Error 1
Error in tools::buildVignettes(dir = ".") : running 'make' failed
Execution halted
This answer comes from Martin Morgan. I tested it on the 2.11 windows
build machine and it works. I didn't commit the change.
The Makefile clean: target needs to make the inst/doc directory look
like it should when R CMD build finishes, so
PDFS= ggbio.pdf
all: $(PDFS)
clean:
rm -f *.tex *.bbl *.blg *.aux *.out *.log *.spl *tikzDictionary *.toc
rm -rf figures Makefile knit.sh
%.pdf: %.Rnw
"$(R_HOME)"/bin/Rscript -e "library(knitr); knit2pdf('$*.Rnw')"
The following is more of a hack, but... you can minimize unwanted
'Sweave' processing by setting \SweaveOpts{eval=FALSE} in the LaTeX
preamble. This means that chunks are not evaluated in the 'Sweave'
pass (unless they explicitly have eval=TRUE, which they usually
don't). On the other hand opts_chunk$set(eval=TRUE) restores the
default but only in knitr. There will not be any left-over Rplot.pdf.
I'm assuming that knitr respects local chunk options, so
<<eval=FALSE>>= would still suppress chunk evaluation even in knitr.
Index: ggbio.Rnw
===================================================================
--- ggbio.Rnw (revision 70240)
+++ ggbio.Rnw (working copy)
@@ -63,6 +63,8 @@
\author{Tengfei Yin}
\date{\today}
+\SweaveOpts{eval=FALSE}
+
\begin{document}
% \setkeys{Gin}{width=0.6\textwidth}
\maketitle
@@ -70,10 +72,11 @@
\tableofcontents
\newpage
-<<setup, include=FALSE, cache=FALSE>>=
+<<setup, include=FALSE, cache=FALSE, eval=TRUE>>=
library(knitr)
opts_chunk$set(fig.path='./figures/ggbio-',
- fig.align='center', fig.show='asis')
+ fig.align='center', fig.show='asis',
+ eval=TRUE)
options(replace.assign=TRUE,width=90)
Thanks,
Dan
Thanks Tengfei On Thu, Sep 27, 2012 at 5:08 PM, Tengfei Yin <yintengfei at gmail.com> wrote:
On Thu, Sep 27, 2012 at 4:48 PM, Herv? Pag?s <hpages at fhcrc.org> wrote:
Tengfei, On 09/27/2012 01:05 PM, Tengfei Yin wrote:
On Thu, Sep 27, 2012 at 2:42 PM, Herv? Pag?s <hpages at fhcrc.org
<mailto:hpages at fhcrc.org>> wrote:
Hi Tengfei,
Yes, as Dan said, that should work. Make sure you indent the
Makefile
properly though (normally with a tab), or it won't work:
------------------------------__------------------------------__-----------
PDFS= ggbio.pdf
all: $(PDFS)
clean:
rm -f *.tex *.bbl *.blg *.aux *.out *.log *.spl
*tikzDictionary
%.pdf: %.Rnw
$(R_HOME)/bin/Rscript -e "library(knitr);
knit2pdf('$*.Rnw')"
------------------------------__------------------------------__-----------
Also note the use of a regexpr in the call to knit2pdf() so that all
Sweave files in the folder will be processed.
I would suggest 3 more things:
1. Add *.toc to the rm command above.
2. Don't forget to add knitr to the Suggests field of your
package.
3. If you've not done it already, add library(knitr) right before
the
knit_hooks$... line in the set-options code chunk in each of
your
Rnw files, so that people can still run Sweave() on them if
they
want.
Cheers,
H.
Hi Herv?,
Thanks a lot for your suggestion, I haven't done that yet, so I could
make all those changes.
Potential issues is that(actually as Martin just mentioned), if my Rnw
won't be running through sweave(sweave first run on my Rnw) which
because knitr-specified tag is included in my Rnw file, and Sweave won't
recognize, for example, may be tag, fig.cap = " with quotes", there is
no such tag and I guess I cannot use quotes, I guess I am hitting a
potential problem like that, one solution could be that I have to put a
fake Rnw first, then remove fake vignette and run knitr on real Rnw file
somewhere and copy it to the right location to replace the fake
vignette...
I am experimenting on my machine now... hope that would work, I heard
from knitr designer that Rcpp did similar things like that.
Note that the above Makefile is exactly (except for the package name itself) the file used in the knitr package (which vignettes are of course generated with knitr). All the details here: http://yihui.name/knitr/demo/vignette/ The above document also covers the issue of "vignettes having to go through Sweave first anyway", and, as you figured it out, it seems that the workaround is required only if the syntax of your vignette is not compatible with Sweave. And yes the workaround involves putting a fake vignette first and do other kind of dark voodoo. BTW I'm assuming you have a good reason to not use a Sweave-compatible syntax, otherwise maybe you could reconsider, as that would make things much easier (and you already get some nice improvements to the rendering of your vignette, when using knitr in Sweave-compatible mode).
Exactly, I am going to give up to do the dark voodoo...even though I came up with a solution, but not elegant at all looks like R CMD INSTALL run sweave again on my real Rnw to stangle the R file, so in my make file I have to copy a sweavable version of my real Rnw file in the right place, then in this case, the pdf and R code are consistency, but Rnw file are not really, it's just sweavable. At first I hope I can write a Rnw file with knitr without considering the compatibility with Sweave, but I guess that's too tricky, you are right, I already get most I need from knitr, and I can just tweak it to be compatible with sweave, and use above Makefile to get what I need without spending too much time hacking at those stuff. Thanks a lot. Tengfei
Cheers, H.
Tengfei
On 09/27/2012 08:08 AM, Dan Tenenbaum wrote:
On Wed, Sep 26, 2012 at 11:41 PM, Tengfei Yin
<yintengfei at gmail.com <mailto:yintengfei at gmail.com>> wrote:
Dear maintainers and developers,
I am wondering, is there a way to use knitr to built my
vignette, I am
trying to write a Makefile under my inst/doc, something like
# Makefile to use knitr for package vignettes
# put all PDF targets here, separated by spaces
PDFS= ggbio.pdf
all: $(PDFS)
clean:
rm -f *.tex *.bbl *.blg *.aux *.out *.log *.spl
*tikzDictionary
%.pdf: %.Rnw
$(R_HOME)/bin/Rscript -e "library(knitr);
knit2pdf('ggbio.Rnw')"
Then I realize the bioc maintained two branch, released and
development, so
the R version it used to check each branch must be
different, I don't
really know how to specify those in my Makefile, especially
after next
Monday, the devel-branch become released version
automatically, there must
be a problem if I set up a fixed point to some
*/bin/Rscript?
I don't really know how it works with bioconductor, the
example above
should work for cran, but I guess things are very different
between cran
and bioc.
If you use "$(R_HOME)/bin/R" in your Makefile, as you do, the
correct
R will be used.
Dan
thanks a lot!
Tengfei
--
Tengfei Yin
MCDB PhD student
1620 Howe Hall, 2274,
Iowa State University
Ames, IA,50011-2274
[[alternative HTML version deleted]]
_________________________________________________
Bioc-devel at r-project.org <mailto:Bioc-devel at r-project.org>
mailing list
https://stat.ethz.ch/mailman/__listinfo/bioc-devel
<https://stat.ethz.ch/mailman/listinfo/bioc-devel>
_________________________________________________
Bioc-devel at r-project.org <mailto:Bioc-devel at r-project.org>
mailing list
https://stat.ethz.ch/mailman/__listinfo/bioc-devel
<https://stat.ethz.ch/mailman/listinfo/bioc-devel>
--
Herv? Pag?s
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpages at fhcrc.org <mailto:hpages at fhcrc.org>
Phone: (206) 667-5791 <tel:%28206%29%20667-5791>
Fax: (206) 667-1319 <tel:%28206%29%20667-1319>
--
Tengfei Yin
MCDB PhD student
1620 Howe Hall, 2274,
Iowa State University
Ames, IA,50011-2274
-- Herv? Pag?s Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpages at fhcrc.org Phone: (206) 667-5791 Fax: (206) 667-1319
-- Tengfei Yin MCDB PhD student 1620 Howe Hall, 2274, Iowa State University Ames, IA,50011-2274
-- Tengfei Yin MCDB PhD student 1620 Howe Hall, 2274, Iowa State University Ames, IA,50011-2274