[Phylobase-commits] r639 - pkg/inst/doc

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Sat Sep 12 02:47:39 CEST 2009


Author: pdc
Date: 2009-09-12 02:47:39 +0200 (Sat, 12 Sep 2009)
New Revision: 639

Added:
   pkg/inst/doc/developer.Rnw
   pkg/inst/doc/developer.pdf
Removed:
   pkg/inst/doc/technotes.Rnw
   pkg/inst/doc/technotes.pdf
Log:
Rename technote to developer to better indicate contents/target
Expand developer guide and add framework additional suggested sections

Copied: pkg/inst/doc/developer.Rnw (from rev 638, pkg/inst/doc/technotes.Rnw)
===================================================================
--- pkg/inst/doc/developer.Rnw	                        (rev 0)
+++ pkg/inst/doc/developer.Rnw	2009-09-12 00:47:39 UTC (rev 639)
@@ -0,0 +1,277 @@
+\documentclass{article}
+%\VignettePackage{phylobase}
+%\VignetteIndexEntry{A developers guide for contributing to phylobase}
+
+\usepackage[utf8]{inputenc} % for UTF-8/single quotes from sQuote()
+\usepackage{graphicx}       % for jpeg and pdf figure support
+\usepackage[usenames,dvipsnames]{color} % loads colors w/ easy names for coloring our links
+\usepackage[colorlinks=true,urlcolor=Blue,linkcolor=BrickRed,bookmarks=true]{hyperref}
+\usepackage{url}
+\usepackage[noae]{Sweave}
+
+\newcommand{\code}[1]{{{\tt #1}}}
+\newcommand{\pb}{\texttt{phylobase }}
+
+%% Use a little bit more of the page
+%% borrowed from Rd.sty, of r-project.org
+\addtolength{\textheight}{12mm}
+\addtolength{\topmargin}{-9mm}   % still fits on US paper
+\addtolength{\textwidth}{24mm}   % still fits on US paper
+\setlength{\oddsidemargin}{10mm}
+\setlength{\evensidemargin}{\oddsidemargin}
+
+\title{Developers guide to \pb}
+\author{Peter Cowan, Ben Bolker \& other developers of \pb}
+\date{\today}
+
+\begin{document}
+\maketitle
+
+\tableofcontents
+
+<<setOptions, echo=false>>=
+options(width=40)
+@
+
+\section{Introduction}
+
+This vignette is intended as a guide for the development of \pb and a repository of technical notes of primary interest to it's developers and others interested in gory details --- by contrast the other \pb vignette is more of an introduction \& user's manual.
+
+\section{R-Forge}
+
+Our development infrastructure hosted by R-Forge,\footnote{\url{http://phylobase.r-forge.r-project.org}} and includes a Subversion repository (see \autoref{subversion}~[\nameref{subversion}] on \autopageref{subversion}) for source code management, trackers for bug reports and feature requests,\footnote{\url{http://r-forge.r-project.org/tracker/?group_id=111}} and mailing lists for development discussion and tracking changes in the source code.\footnote{\url{http://r-forge.r-project.org/mail/?group_id=111}}
+
+The R-Forge manual\footnote{\url{http://r-forge.r-project.org/R-Forge_Manual.pdf}} describes how to develop a package using their infrastructure Of particular importance is the section on getting ssh keys to work so that you can commit changes to the \code{phylobase} code using Subversion (\code{svn}).
+
+On feature of R-Forge is a package repository that allows prerelease versions of \pb to be install directly from \code{R}.
+
+<<RforgeInstall, eval=false>>=
+install.packages("phylobase", repos = "http://r-forge.r-project.org")
+@
+
+\section{Building \code{phylobase}}
+
+If you are interested in building \pb from source, you will need the same tools required to build \code{R} itself.  These are documented in the R Installation and Administration manual.\footnote{\url{http://cran.r-project.org/doc/manuals/R-admin.html}} If you are running Mac OS X you’ll need to have the developer tools.\footnote{\url{http://developer.apple.com/technology/xcode.html}}  On Windows you'll need to install the ``Windows toolset''\footnote{\url{http://www.murdoch-sutherland.com/Rtools/}} as described in the above manual.  If you are running Linux, you probably already know what you need.  To build the vignettes and \LaTeX~documentation you will need to install a \TeX~distribution like MacTex\footnote{\url{http://www.tug.org/mactex/}} for Mac OS X, Tex-Live for Linux, or MiKTeX\footnote{\url{http://www.miktex.org/}} for Windows.  Once you have the proper tools installed follow the instruction in the Writing \code{R} Extensions manual.\footnote{\url{http://cran.r-project.org/doc/manuals/R-exts.html}}
+
+\section{Coding standards}
+
+We try to follow the coding standards of Bioconductor.\footnote{\url{http://wiki.fhcrc.org/bioc/Coding_Standards}}  Namely, variables and particularily function exposed to users should be in \code{camelCase}.  As of this writing many non-exported functions are prefixed with `.' however, future private functions should be named without this convention.  Indentation should be 4 spaces and tabs should be avoided.  We also use \code{<-} for assignment, and place spaces after commas, in indexes and function calls (e.g. \code{df[2, 2]} and \code{seq(1, 2, 0.1)}, not \code{df[2,2]} or \code{seq(1,2,0.1}.)
+
+\section{Unit testing with RUnit}
+
+We are in the process of moving our testing infrastructure to the \code{RUnit}\footnote{\url{http://cran.r-project.org/web/packages/RUnit/index.html}} framework.  New contributions and bug fixes should be accompanied by unit tests which test the basic functionality of the code as well as edge cases (e.g what happens when the function is passed an empty string or negative number -- even when those inputs don't make sense.)  Unit tests are stored in the \code{inst/unitTests/} directory and are named according to the source file they correspond to.  See the included tests and the \code{RUnit} documentation for further details. \code{RUnit} has a few advantages over the other testing frameworks in \code{R}, namely the examples in documentation, vignettes,  
+
+\section{Non-exported functions}
+
+These functions are for internal use in \code{phylobase} not exported.  Since most are not documented elsewhere, they are documented here.
+
+\begin{description}
+
+    \addcontentsline{toc}{subsection}{.chnumsort}
+    \item[\code{.chnumsort}] A convenience function that coerces vector of strings to numbers for sorting, then coerces the vector back to stings.  Currently only used inside the \code{prune} method.
+
+    \addcontentsline{toc}{subsection}{.createEdge}
+    \item[\code{.createEdge}]
+
+    \addcontentsline{toc}{subsection}{.createLabels}
+    \item[\code{.createLabels}] Used any time labels are needed, including when updating the labels via \code{labels()<-} or constructing a \code{phylo4} object.  It takes a vector of names to use or \code{NULL} if new labels should be generated, integers indicating the number of tips and internal nodes, as well as a string to indicated the type of labels to generate ``tip'' and ``internal'', for either tip or internal labels along or ``allnode'' or all nodes.
+
+    \addcontentsline{toc}{subsection}{.genlab}
+    \item[\code{.genlab}] A handy function that can generate labels for applying to nodes and tips.  The function takes to arguments, a `base' string, and an integer indicating the number of labels desired.  The result is a vector of string with a number (padded with `0') suffix e.g. \code{foo01...foo12}.  This function is used to generate names in the \code{.createLabels} function as well as for for making temporary names during the \code{prune} method.
+
+    \addcontentsline{toc}{subsection}{.phylo4Data}
+    \item[\code{.phylo4Data}]
+
+    \addcontentsline{toc}{subsection}{.phylo4ToDataFrame}
+    \item[\code{.phylo4ToDataFrame}]
+
+    \addcontentsline{toc}{subsection}{.bubLegendGrob}
+    \item[\code{.bubLegendGrob}] This function generates a \code{Grid} graphics object (a grob) for  drawing the \code{phylobubbles()} legend.  For reason I have not been able to understand, it must be defined outside of the \code{phylobubbles} function.  It takes the raw tip data values for a \code{phylo4d} object as well as the scaled values used for making the bubble plot, both of these vectors are passed directly to the \code{drawDetails.bubLegend} function.
+
+    \addcontentsline{toc}{subsection}{drawDetails.bubLegend}
+    \item[\code{drawDetails.bubLegend}] This function is the \code{drawDetails} method for the \code{bubLegend} grob described above.  The \code{drawDetails} method is called every time a plot is generated or resized.  In this case it calculates labels and sizes for drawing the example bubbles in the phylobubbles legend.  This is necessary because the because the main bubble plot bubble can change in size as the plot is resized.  Because the legend and the bubble plot occur in different viewports the legend cannot know the size of the main plot circles (they are plotted relative to the space available in their viewport.)
+
+    \addcontentsline{toc}{subsection}{orderIndex}
+    \item[\code{orderIndex}] This function is called from the \code{reorder} method.  It takes a \code{phylo4} or \code{phylo4d} object and a string indicating the desired tree ordering, currently one of ``preorder'' or ``postorder''.  It's value is a vector indicating the respective ordering of the edge matrix from top to bottom (i.e. in postorder the first edge in the edge matrix would terminate in a tip, while in preorder the first edge would be the root edge.
+    
+\end{description}
+
+\section{The Nexus Class Library and Rcpp}
+
+
+\section{S4 classes and methods}
+
+\section{Grid graphics}
+
+\section{Converting between tree formats and ``round-trip'' issues}
+
+We should in principle be able to convert from other formats to \code{phylo4}(\code{d}) and (\code{ape::phylo}, \code{ouch::ouch} etc.) and back without losing any information. The two classes of exceptions would be (1) where \code{phylo4} stores \emph{less} information than the other formats (we would try to avoid this), and (2) where there are ambiguities etc. in the other formats (we would try to avoid this, too, but it may be difficult; ideally we would consult the package maintainers and try to get them to eliminate the ambiguities in their formats).
+
+Ideally we would be able to use \code{identical()} to test equality --- this tests ``bit-by-bit'' equality, and is intolerant of \emph{any} differences in format. More loosely, \code{all.equal()} allows for numeric variation below a certain tolerance, etc. (these correspond to \code{RUnit::checkEquals()} and \code{RUnit::checkIdentical()}).
+
+Case in point: \code{ape} is not entirely consistent in its internal representations, which causes some difficulty in creating perfect round trips (see \code{tests/roundtrip.R} for workarounds). In particular,
+
+\begin{itemize}
+
+  \item \code{unroot()} contains several statements that subtract 1 from
+  components of the data structure that were previously stored
+  as \code{integer}.  Because 1 is subtracted an not \code{1L}
+  (an explicitly integer constant), this coerces those elements
+  to be \code{numeric} instead.
+
+  \item different ways of creating trees in \code{ape}
+    (\code{read.tree()}, \code{rcoal()})
+    generate structures with the internal elements in different orders.
+    When \code{phylobase} re-exports them, it always uses the order
+    \{\code{edge}, \code{edge.length}, \code{tip.label},
+    \code{Nnode}, [\code{node.label}], [\code{root.edge}]\},
+    which matches the trees produced by \code{rcoal} but not
+    those produced by \code{read.tree}
+
+  \item because of differences in ordering standards, it's not
+    clear that we can always preserve ordering information through
+    non-trivial manipulations in phylobase
+\end{itemize}
+
+
+\appendix
+\section{Subversion}\label{subversion}
+
+\subsection{Organization of the \code{phylobase} repository}
+The \code{phylobase} subversion repository is organized with four top level directories
+\begin{itemize}
+    \item \code{branches/} where changes that will result in large disruption of the package take place
+    \item \code{pkg/} where the main trunk of the project exists.  This directory is built and available through the R-Forge install mechanism so it is important that it passes \code{R CMD check}
+    \item \code{tags/} where copies of previous \code{phylobase} releases are kept
+    \item \code{www/} where the R-Forge webpage for phylobase is maintained.  This must be kept and the top level for R-Forge to find it
+\end{itemize}
+
+\subsection{Using subversion for the first time}
+The general a subversion work flow goes as follows. I’ve written this with macs linux in mind, however windows users will follow the same work flow but probably use a graphical front end for subversion, like TortoiseSVN.\footnote{\url{http://tortoisesvn.tigris.org/}}
+
+R-Forge allows code to be checked out in two different ways.  First, you can get the code anonymously using this terminal command:
+
+\begin{verbatim}
+svn checkout \
+svn://svn.r-forge.r-project.org/svnroot/phylobase
+\end{verbatim}
+
+If you would like to make commits directly to the source repository you need to register with R-Forge and be added to the \code{phylobase} project as a developer.  Once you've done this, you’ll need to have the ssh key set up in your R-Forge account.  These terminal commands will make a copy of the folder ``phylobase'', and all the source files for the package, in whatever directory you are in (in this case ``\code{~/Code}''), change ``\code{[name]}'' to your R-Forge username. 
+
+\begin{verbatim}
+cd ~/Code/
+svn checkout \
+svn+ssh://[name]@svn.r-forge.r-project.org/svnroot/phylobase
+\end{verbatim}
+
+Once you have a copy of the package, hack away at it and adding functions and documentation. Save changes. Then check to make sure you have the latest version of the package, it is often the case that another developer has committed a change while you were working.
+
+\begin{verbatim}
+svn update
+\end{verbatim}
+
+R provides some tools for checking packages. They help ensure that the package can be installed and that all the proper documentation has been added. To keep the repository clean of files that are created during the build process copy the package folder to a tmp folder before running the check.
+
+\begin{verbatim}
+cp -R ~/Code/phylobase/pkg/ ~/Code/phylobase-tmp/
+R CMD check ~/Code/phylobase-tmp
+\end{verbatim}
+
+Fix any errors or warnings that come up, and repeat \code{R CMD check} as necessary.  The R core developers provide a manual \footnote{\url{http://cran.r-project.org/doc/manuals/R-exts.pdf}} for writing R Extensions (packages) which describes the package and documentation formats.  Main gotchas are being sure that you’ve properly updated the \code{DESCRIPTION} and \code{NAMESPACE} files and ensuring that the documentation is in the proper format.  \code{R CMD check} warnings/errors are very useful for helping figure out what the issue is. And, the command \code{prompt()} will provide ``fill-in-the-blank'' documentation if you’re documenting a function for the first time.
+
+The next step is to take a look at what we’ve actually changed. The \code{status} command will show any file that’s been added (\code{A}), modified (\code{M}), or is unknown (and may need to be added) to subversion (\code{?}).
+
+\begin{verbatim}
+svn status
+\end{verbatim}
+
+For instance if I’ve added a new file called foo.R subversion doesn’t
+follow it until I tell it to. So I might see something like:
+
+\begin{verbatim}
+? fooBar.R
+\end{verbatim}
+
+Which we can remedy with
+
+\begin{verbatim}
+svn add fooBar.R
+\end{verbatim}
+
+svn status will then show:
+
+\begin{verbatim}
+A fooBar.R
+\end{verbatim}
+
+Update again for good measure (you can’t overdo it on this).
+
+\begin{verbatim}
+svn up
+\end{verbatim}
+
+And, finally commit the changes with a helpful message (the -m portion) about what they change does:
+
+\begin{verbatim}
+svn commit fooBar.R -m "Function fooBar for calculating foo on the class bar"
+\end{verbatim}
+
+Subversion, has a whole bag of tricks, full documentation of which can be found in the subversion book.\footnote{\url{http://svnbook.red-bean.com/}} There are also a number of graphical interface programs that you can use with Subversion as well.
+
+\subsection{Subversion patches}
+
+If you don't have developer access to the project but you'd like to fix a bug or add a feature you can provide the change as a patch.  To make a patch with subversion first get a copy of the most recent code.
+
+\begin{verbatim}
+svn checkout svn://svn.r-forge.r-project.org/svnroot/phylobase/pkg
+\end{verbatim}
+
+Make whatever changes in the code or documentation are necessary.  For instance if there is a simple function \code{helloWorld}, in a file called fooBar.R
+
+\begin{verbatim}
+helloWorld <- function(){
+    # This is a comment
+    print('Hello World!')
+}
+\end{verbatim}
+
+And, I want to update it, would find the file fooBar.R in my svn checkout and change it to:
+
+\begin{verbatim}
+helloWorld <- function(x){
+    # This is a comment
+    # This is a new comment
+    print(paste('Hello', x, '!')
+}
+\end{verbatim}
+
+To supply that change to a developer with subversion access I would make a diff file of the change.  The way to make a diff is to run the \code{svn diff} command on the file in question.
+
+\begin{verbatim}
+svn diff fooBar.R > helloWorld.diff
+\end{verbatim}
+
+This however just spits the output of \code{svn diff} to the terminal.  To save the output to a file use ``\code{>}'' which tells the terminal to save the output to a file, this file should end in ``.diff'' and will have pluses and minuses to indicate which lines have been added and removed.
+
+\begin{verbatim}
+svn diff fooBar.R > fooBar.diff
+\end{verbatim}
+
+\begin{verbatim}
+--- /Users/birch/fooBar.R
++++ /Users/birch/fooBar.R
+@@ -1,4 +1,5 @@
+-helloWorld <- function(){
++helloWorld <- function(x){
+     # This is a comment
+-    print('Hello World!')
++    # This is a new comment
++    print(paste('Hello', x, '!')
+ }
+\end{verbatim}
+
+The fooBar.diff file can then be sent to the developers mailing list or the R-Forge Patches issue tracker.\footnote{\url{https://r-forge.r-project.org/tracker/?atid=490&group_id=111&func=browse}} Where another developer can easily review and apply the patch.
+
+\subsection{Branching and merging with svn}
+
+\end{document}

Added: pkg/inst/doc/developer.pdf
===================================================================
--- pkg/inst/doc/developer.pdf	                        (rev 0)
+++ pkg/inst/doc/developer.pdf	2009-09-12 00:47:39 UTC (rev 639)
@@ -0,0 +1,3352 @@
+%PDF-1.4
+%ÐÔÅØ
+4 0 obj
+<< /S /GoTo /D (section.1) >>
+endobj
+7 0 obj
+(Introduction)
+endobj
+8 0 obj
+<< /S /GoTo /D (section.2) >>
+endobj
+11 0 obj
+(R-Forge)
+endobj
+12 0 obj
+<< /S /GoTo /D (section.3) >>
+endobj
+15 0 obj
+(Building phylobase)
+endobj
+16 0 obj
+<< /S /GoTo /D (section.4) >>
+endobj
+19 0 obj
+(Coding standards)
+endobj
+20 0 obj
+<< /S /GoTo /D (section.5) >>
+endobj
+23 0 obj
+(Unit testing with RUnit)
+endobj
+24 0 obj
+<< /S /GoTo /D (section.6) >>
+endobj
+27 0 obj
+(Non-exported functions)
+endobj
+28 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+31 0 obj
+(.chnumsort)
+endobj
+32 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+34 0 obj
+(.createEdge)
+endobj
+35 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+37 0 obj
+(.createLabels)
+endobj
+38 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+40 0 obj
+(.genlab)
+endobj
+41 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+43 0 obj
+(.phylo4Data)
+endobj
+44 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+46 0 obj
+(.phylo4ToDataFrame)
+endobj
+47 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+49 0 obj
+(.bubLegendGrob)
+endobj
+50 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+52 0 obj
+(drawDetails.bubLegend)
+endobj
+53 0 obj
+<< /S /GoTo /D (section*.2) >>
+endobj
+55 0 obj
+(orderIndex)
+endobj
+56 0 obj
+<< /S /GoTo /D (section.7) >>
+endobj
+59 0 obj
+(The Nexus Class Library and Rcpp)
+endobj
+60 0 obj
+<< /S /GoTo /D (section.8) >>
+endobj
+63 0 obj
+(S4 classes and methods)
+endobj
+64 0 obj
+<< /S /GoTo /D (section.9) >>
+endobj
+67 0 obj
+(Grid graphics)
+endobj
+68 0 obj
+<< /S /GoTo /D (section.10) >>
+endobj
+71 0 obj
+(Converting between tree formats and ``round-trip'' issues)
+endobj
+72 0 obj
+<< /S /GoTo /D (appendix.A) >>
+endobj
+75 0 obj
+(Subversion)
+endobj
+76 0 obj
+<< /S /GoTo /D (subsection.A.1) >>
+endobj
+79 0 obj
+(Organization of the phylobase repository)
+endobj
+80 0 obj
+<< /S /GoTo /D (subsection.A.2) >>
+endobj
+83 0 obj
+(Using subversion for the first time)
+endobj
+84 0 obj
+<< /S /GoTo /D (subsection.A.3) >>
+endobj
+87 0 obj
+(Subversion patches)
+endobj
+88 0 obj
+<< /S /GoTo /D (subsection.A.4) >>
+endobj
+91 0 obj
+(Branching and merging with svn)
+endobj
+92 0 obj
+<< /S /GoTo /D [93 0 R  /Fit ] >>
+endobj
+119 0 obj <<
+/Length 1156      
+/Filter /FlateDecode
+>>
+stream
+xÚíYËrÛ6Ýû+8]dÈ™Á‹ ¸ô#ö¤õ¤[Y9]P&$q"‘²~}/J–D;åG=Š7 ‚÷ÜàW888ÙÃ÷Ôƒ½Ç$	ˆD”$<Œ’&Hª4£CS\„Gú*¢"ÔÓªŽb÷`š(f˜†ãy‘kÿh«èïÁï`N¬™ãšZk¨ž|ŸVìÑ]_‚Ò$¡®oLE\&ALR)õŸüQj«
+À ôaå~_»"+ßû¶]vÕô[Û½ëüÎU2¬ìdÑ’»‘ÈÅHd7xQnéßR¢\!`õ“ô¹@\1 Ïç‰ÿä\×VÏæ°ôx„¼÷ähDBŒSo‘*ðb\t#AÌ)ˆ‘z‹‡U1Zí«Æ}	Šbp)‡Ì|zM€Ø EŠRA…³*ð‡a´†I§4	?]ÓTŽ_˜Ï/mˆÄO›€c0Ì›Î-ô`,ÝÇ[-L´Øgñq”‚f¬Ÿ‘yăy1Í‹rìýÏðŠ{üNí—Ä6<Ê8G’=†%_gÉ=ËÃNG4fŠ…ÍÊ<3y³î¦XŠ,UCÆ됉‡üRÖcYÝØ"ŠI¸ ¿.ìÄ?¹©ÒöÜ A%æ
+|¼=
+ái|®ÊXßÔíð+cuîG󲝗M˜1ö àÇjEAX~)üÂöTÐeDU8)]9Ÿ5 at cgˆ¢8ÁøÞŠ§ÿÙeªsÃgn…ZÄ¥Ÿ)ëòYý1ßÜ4.b!Õ3
+f‡Äzf]N3ùÄÜÞbU„üÓñÕW}]èÓè2ÖåDéEŽä—Û’žK¨'Z@õÄ…8wð£Ìf›8œ‘·øòâÚˆž6ƒ$•Sè8R<4Ù¬‡8§;9ó_Áf6œO5ìhù‰©z{šTô-Ô¿@¨ÏMæVÃõ‘¶Y1mnEé”™ØåHð¢á¡2¹6ŸÊ\ßô 0¥¿œ›ŸdKâ[貑ˆWÈÕÛ¬ô·ÙÁDûûëg}3w™'ˆ‡Ó¬i|ëi14™ùîdí•;"aîû]Öuï¶K˜”KÒÛ\³•'vÎ=è¥#£;fYÙݶgÚNºÄ¡z
+'¦èàÆ&«'Åe?·A™Øj‘‐`ŸC£á•+´±]Z…»ª´u™µëö¥ŽœíKkt§Þ¨2³Ìnzé+aÜTó2­)êß|cÑ4sÝô(“äQNۏb$ÏçՁ4÷dê–I¬dë¼HÌR‚°\߁ö‰b)iø§geñOÖ¦
+c—©F®§Mô©5V(½/¯ºŠ›`ÄÒ%£ëö.Y5…­`¡l^÷Áá¯rߺ+$Û„€˜‚ë‡Ñ}D½_?•Áñ
+ÌðÔ•+º™Ñ
+s÷V™¶å+LÓXÿÃýÓkÊånd›’'ˆºûˆy_Ÿ/,×\gÖçûË^`ö–Å€(+žDîu80Y龜û~Kf.p™q׺L[»µqUöo
+ÉN¹Xn¸¸{K”BœÁ6.TûçF÷ÇÏjߏƒ½±áÃÃ
+endstream
+endobj
+93 0 obj <<
+/Type /Page
+/Contents 119 0 R
+/Resources 118 0 R
+/MediaBox [0 0 612 792]
+/Parent 130 0 R
+/Annots [ 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R ]
+>> endobj
+94 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 522.744 179.452 531.655]
+/A << /S /GoTo /D (section.1) >>
+>> endobj
+95 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 498.889 156.379 509.655]
+/A << /S /GoTo /D (section.2) >>
+>> endobj
+96 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 476.695 209.7 487.82]
+/A << /S /GoTo /D (section.3) >>
+>> endobj
+97 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 455.054 204.514 465.902]
+/A << /S /GoTo /D (section.4) >>
+>> endobj
+98 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 433.136 237.887 443.984]
+/A << /S /GoTo /D (section.5) >>
+>> endobj
+99 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 411.218 235.057 422.066]
+/A << /S /GoTo /D (section.6) >>
+>> endobj
+100 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 401.2 164.523 410.111]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+101 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 387.308 166.819 398.156]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+102 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 377.29 173.24 386.201]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+103 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 363.397 147.282 374.246]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+104 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 351.442 169.283 362.29]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+105 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 339.487 207.916 350.335]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+106 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 327.532 189.028 338.38]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+107 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 315.577 218.487 326.425]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+108 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 305.559 163.388 314.47]
+/A << /S /GoTo /D (section*.2) >>
+>> endobj
+109 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 281.704 294.386 292.552]
+/A << /S /GoTo /D (section.7) >>
+>> endobj
+110 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 261.723 233.339 270.634]
+/A << /S /GoTo /D (section.8) >>
+>> endobj
+111 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 237.868 184.919 248.716]
+/A << /S /GoTo /D (section.9) >>
+>> endobj
+112 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 215.95 404.038 226.798]
+/A << /S /GoTo /D (section.10) >>
+>> endobj
+113 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 195.97 170.556 204.881]
+/A << /S /GoTo /D (appendix.A) >>
+>> endobj
+114 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 181.801 321.738 192.925]
+/A << /S /GoTo /D (subsection.A.1) >>
+>> endobj
+115 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 170.122 288.115 180.97]
+/A << /S /GoTo /D (subsection.A.2) >>
+>> endobj
+116 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 158.167 221.808 169.015]
+/A << /S /GoTo /D (subsection.A.3) >>
+>> endobj
+117 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.294 146.212 281.971 157.06]
+/A << /S /GoTo /D (subsection.A.4) >>
+>> endobj
+120 0 obj <<
+/D [93 0 R /XYZ 99.346 730.572 null]
+>> endobj
+121 0 obj <<
+/D [93 0 R /XYZ 100.346 692.71 null]
+>> endobj
+126 0 obj <<
+/D [93 0 R /XYZ 100.346 535.793 null]
+>> endobj
+118 0 obj <<
+/Font << /F15 122 0 R /F16 123 0 R /F17 124 0 R /F28 125 0 R /F29 127 0 R /F30 128 0 R /F8 129 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+158 0 obj <<
+/Length 2866      
+/Filter /FlateDecode
+>>
+stream
+xÚµYmoÛÈþî_!äCCÖšË]¾½’àR¤—4hbà$AJ“”Äš"uK2¶þøÎì)RfÛ¹û"îûÎÎë3#w±Y¸‹œ¸ü}~~röÒ‹R¥oq¾^H×Åö"ˆ<êpqž->:r¹’ÒóWÕRI§5õr߬KÛ¢®–ŸÏÿyö2ZÄ"¼ Ïp+OŠÈ“´û|[4Ë•ÖžóµØTyÛæØSN?ZTK/rÚ¼ÊòŒF’†V$ÔÝtE–Ss]šj·<’å_q{^Öû]'…NKõš(Sîˆ4/TBAÓ%ÒöÛ›²¾Hšüö#|O(Wõ“ª'®7ù~¹‚»ê¦hksCƒtãb¥<_^¼ ¦‰Ø÷é„6O‘ÎmU¤I‰üSNU·yƒMK¬Ú›b—ày8Ø3ÆäMKÓmÍ3íÓ†FFÏ‚ aøDK1®¨ÛíR:À-éôsãƒs^cvnSÓõxt›%où}.Á7ö™îô}iM‡šÄ«4‰H)KAnf„IúÅA‰ðlT"¼lW›þ¶5}“Šfø±¨´ðÍ:`FŠÌ°ºkWþ…>]“›§ýq‰ÝÕ%¥ z¦V²’J×W(kƒ¹XÊ<6“w«—ËX;µÙäß5Ž·ÁYÃƒGNKEµFž°¶®ã¶fÁ)+’ȹ¡q¼9RöæS¼,ÝQ?±†xÄåâÖЯàÂE âPEÖF<x[,JÒï Fncú P„‘FV“êYÒӲˬŽ+kÍ8ø¾³JDjk–‚Ç&L
+?¹¾Û ´òüï+à1(×DEŸíÙFª¬¸“
+çÙäa‹0è;rÕǹMu>ÓeÃÄý¶´ì“MN»ýãS7’¦È+B£©;“òú”ž» ÑpT¯Z§0Çh­Ö+]ZÕC÷€wÇ]tj²1m3güƒ³Yç	k©D'ù{¦y¼*Æ®ð•k¢w§&Z¯{K”x²¢ÚP§,€(¦Ÿ:ö£¨kèK¥³³j7X"®)š´kXc¥:œ>°q¸"E†¢ßMª=³{Y
+_6VÄ‘šr³—"Í Eñh&úè¢&æ¬î`âJ…"ŽC È~8„pÔ¢(<8xچǬ¯t¬Ù-jÌ®g©dwªï 2J²¨y5¸™Ôdà
+Q¶­Q*WÔÁØ©£`ìhi ¡ù}o
+¾ï$ýÛº$Oå#¶ya¨yì•qì-Ç)CáGÎgŸ˜¶H»2¼ vŠÝ`RI…Ò¶ƒ
+}mèÄF“Ʋ‰ÛVÛìªfKK«Ã7ý)5}¯ð½µ¹äÅuGÒRëwÕuRŒ›^è‚æív¯ 肺<kþ–¨A«1KÝ+ÎôDõèÅà¿(:“qAs>‚(,fî—®n4`¾æëde äñô¬‚e)¥7}ï[{a4òv*d܍c0MD‰(þE#=HÏpp&ø…,!»µ,I•ù¨½ìVæÈEÛ±‚WÌ¢_¥cÞý®T E΋™ŒXÕ´@Á¦¬0 °%£‘µ©wsò@Ï"½žŠw3Š ¼î1þRÞ˜:鹐xJÅ2¢•_®|@_L >_ÔŠ'ÃSŸœÒ*`xÝPó'ú<Ù¶íþ¯ggfµFÙ	³Ú›ú¿ðÝ'6ØÎ Aw
+CÀç]Qf¨°vø¨Ñ–(:’÷¯œ ÆW6S-v«„žëKô˜À}Ìa'†€>&k*
+ZªûÂñÁL­íá¶N‘oJÞUaZUÞ“DِÜ$»œ‡ÈâkÊ9b‹@¡2¶DˆàYgT2péasá5ºCÕ"xtØÏm“—kú 1æò¤ˆÅÐÈj›ù¥]ŸnÚÁ„e2|û|Kn´C¯0ˆØÓ¬­@ äì®xÿ³lWT MÌhò(yTdU:ÚóÆ À¿3´ñϿ⸦]_HWN%p´ï1“ aºª"íKç
+x<;úö=}?Ї·>µÊ}VhY±ÂÎmrpô<³åFÖ'µÇù/í<èÒãçÅZD ÎF¬îdœö'|³aHý­¨²ƒûþÖétà‚ŸjÎïʱ«•}v-O‹ò
+!ˆñóóöÉ£ µ:žàïðîL08ÂßLÎœeýkŽ’мåA4ÛÀJkM.&ª‡»
+/?¨t^Söß]Ÿ²è
+x;8Vá0€Ð
+nï†0è%¥É“Œ;—U'±wEÑZ“ý(Kô ¡rΗ‘FІÃä l“¾’Ñð]/xMnjbÃðÄLO¸Zq6{Û™î ÎYÛgC¼ ãRkÿe4>þ@d¤=ìâ ÿIúBHWù æè[N Â>{{h±Ac-¨¾…¸  ˜F)rQéÏSé¨T6kA©ºC!§,.—dnç‘X~ýx $ÃcGyFôRÈ4+¡ü’ˆ¡†õðýpÚ¿Þ’¸z]|ÑÎûôX©ºeH8uyKß¿Òi+à½rbðñï¢©Ë#ºµû<´Z°†·6ËÁ¹ƒ¶@]|tpñ}i`Š#§®½)@Ѓ6Y%ÓÈ´&„ëW«íAÖ÷èQ®A©ã£ŠíoÈKS´óxIÂ÷ïF¾? ¼_®Û¼๚æ̏P‘±šDvéÉëVáÒï àC^#ûL›Pë.ì“û}Ø[e‰ÉšïÖ1-³,èDd˜ btMƒã[^Ùçxt!Ì.´ó6§‚áç{¤ºÂjóA]k€‘SžÝUÞ”
+Î&Jþ/@¬ àÁ§ìÈm.g
+ˆÖ™ÅŒê¢QÞ_”7l»~$\÷È…®»ŠTG8„>´ÿ‰D—/¤­R74Ôlë®äé!'ÃNQÍüHB< üñbàëP¸á(ƒ<Ð)_Š"±ôп:кb±Ö7Ô«êj5<Å´=dc°ãyàà Ïò¡!KMƒihCÖûÉ•úšì.. jCK:ÿO±PDœ£Œ 4¬»­Íg$µ–ŽîEÞÂò’¯:¤¼p[¬‘Pw-[–|û¯‘C‘‚*\¼
+‚ Òƒlhi‡éBû ]èhž‡×º\Ö6l“‹æ;Û“_Õ˜-f,éXbB´d=¬-±Z„7tM>›^Aª^ðo«™ÊŠ†dÈ°Ö¿[ûåüä÷ô’îBÿ=z^°S.ÒÝÉÇÏî"ƒIà©PpÑ•]º[H,OÄXT*ïOþMÿdÊ°B†\e ì
+&ïrŠt<þn²Ç\.ú:	%!žÅ!ä7IIË6%¶[¹:€y1ðʦƬ€e6XoPKû~_7Àufsä[&D®øžÀVŸFî!ÑRaÿ*Ý0Iž3*eœaµú2G[8ûycênÿ¥È~’·œà7	õÆEä?“P,ÚŸýŒå×GP)ÇEä?“Êw4ô翼I*ÌSöÙútú?Lgj¬2+a‚Þœeu
+üDâšžâë
+bÛîÊJ>øaZ³ü+* $í¹É~_æ"­wgmžn«ºD’77g×iå¢OŽsÔ¡ïêê
+­w×àÛ–ÚtTØ1%x[K(zö@îE Î›£®í6l&i›_?”ŒøcRq	×[Jî$’WOäÄXõ4ðÞ?@éóë¶ù¾Nhõ&ña´‰­¸Ä€+ÖÛÔ¤–_ø¢Føûå=Jt„¶ÚŽ¿Gá5¥B0$ÈÊ›û“bìÿ§Qè
+endstream
+endobj
+157 0 obj <<
+/Type /Page
+/Contents 158 0 R
+/Resources 156 0 R
+/MediaBox [0 0 612 792]
+/Parent 130 0 R
+/Annots [ 131 0 R 133 0 R 134 0 R 135 0 R 136 0 R 138 0 R 140 0 R 142 0 R 144 0 R 146 0 R 148 0 R 150 0 R 152 0 R 154 0 R 132 0 R 137 0 R 139 0 R 141 0 R 143 0 R 145 0 R 147 0 R 149 0 R 151 0 R 153 0 R 155 0 R ]
+>> endobj
+131 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [323.441 578.762 329.903 591.355]
+/A << /S /GoTo /D (Hfootnote.1) >>
+>> endobj
+133 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [99.35 566.807 155.798 578.762]
+/A << /S /GoTo /D (appendix.A) >>
+>> endobj
+134 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [161.214 566.807 210.059 578.762]
+/A << /S /GoTo /D (appendix.A) >>
+>> endobj
+135 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [230.633 566.807 262.173 578.762]
+/A << /S /GoTo /D (appendix.A) >>
+>> endobj
+136 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.884 555.405 196.346 567.445]
+/A << /S /GoTo /D (Hfootnote.2) >>
+>> endobj
+138 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.291 545.387 158.753 555.49]
+/A << /S /GoTo /D (Hfootnote.3) >>
+>> endobj
+140 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [207.596 531.495 214.058 543.534]
+/A << /S /GoTo /D (Hfootnote.4) >>
+>> endobj
+142 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.757 396.972 501.219 407.074]
+/A << /S /GoTo /D (Hfootnote.5) >>
+>> endobj
+144 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [394.213 383.079 400.675 395.119]
+/A << /S /GoTo /D (Hfootnote.6) >>
+>> endobj
+146 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [240.844 371.124 247.306 383.164]
+/A << /S /GoTo /D (Hfootnote.7) >>
+>> endobj
+148 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [339.681 347.006 346.143 359.253]
+/A << /S /GoTo /D (Hfootnote.8) >>
+>> endobj
+150 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [137.264 335.259 143.726 347.298]
+/A << /S /GoTo /D (Hfootnote.9) >>
+>> endobj
+152 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.391 323.304 239.824 335.343]
+/A << /S /GoTo /D (Hfootnote.10) >>
+>> endobj
+154 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [343.462 268.537 353.895 280.576]
+/A << /S /GoTo /D (Hfootnote.11) >>
+>> endobj
+132 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 214.201 278.481 225.697]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://phylobase.r-forge.r-project.org)>>
+>> endobj
+137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 204.696 329.291 216.193]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://r-forge.r-project.org/tracker/?group_id=111)>>
+>> endobj
+139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 195.192 316.589 206.689]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://r-forge.r-project.org/mail/?group_id=111)>>
+>> endobj
+141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 185.687 317.087 197.184]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://r-forge.r-project.org/R-Forge_Manual.pdf)>>
+>> endobj
+143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 176.183 329.291 187.68]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://cran.r-project.org/doc/manuals/R-admin.html)>>
+>> endobj
+145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 166.679 319.827 178.176]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://developer.apple.com/technology/xcode.html)>>
+>> endobj
+147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 157.174 290.685 168.671]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.murdoch-sutherland.com/Rtools/)>>
+>> endobj
+149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 147.67 226.675 159.167]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.tug.org/mactex/)>>
+>> endobj
+151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 138.166 209.738 149.663]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.miktex.org/)>>
+>> endobj
+153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [114.593 128.661 325.057 140.158]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://cran.r-project.org/doc/manuals/R-exts.html)>>
+>> endobj
+155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
[TRUNCATED]

To get the complete diff run:
    svnlook diff /svnroot/phylobase -r 639


More information about the Phylobase-commits mailing list