[Bioc-devel] To use knitr, how to write the right Makefile for bioconductor devel and released branch?

Dan Tenenbaum dtenenba at fhcrc.org
Sat Oct 6 21:27:29 CEST 2012


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.


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



More information about the Bioc-devel mailing list