documair-package:
Automatic Documentation for (and confection of) R packages
Description
The development of this package was led by the idea that it is a bad
practice to separate code and documentation. Code and documentation
should be at the same place so that both can easily be modified
simultaneously. We proceed according to this principle since the middle
of the 90ties using a Perl script (a very convenient language for this
kind of tasks). Now, we share it with the community by the more
convenient way of an R package. The recent development of R make things
quite easy. To use documair, each code defining an object
(either function or variable) must be encapsulated within a series of
tagged comments; we propose tags but their values can be adapted as you
wish (by modifying the documair0$tag$v list). From these tagged
comments, documair automatically writes Rd files and
gathers them with a few more files to produce the complete package until
the tar.gz. For some specific objects, the user can write
manually the Rd file. All the necessary files must be gathered in
a unique directory. In it, the user must place the following set of
mandatory files (in the following pkg will designate the name of
the package):
- A pkg.DESCRIPTION file: the standard text DESCRIPTION
file to be associated to the package. The NAMESPACE file is
automatically created from the exported objects and the presence of C
and Fortran files.
- A pkg.package.Rd file: a text file describing in Rd syntax
the general description of the package to appear in the
documentation. This file can be slightly supplemented by documair
to add some additional information.
- As many as wanted foo.code.r files where are placed
the documented code of each object. Each files can
include more than one object. The extension code.r can
be modified within the pkg.which.txt file.
Additional optional files can also be included:
- foo.test.r files including some scripts to test the
functions. The extension test.r can be modified within the
pkg.which.txt file.
- pkg.foo.rda files where are placed possible data
sets. These binary files must be loadable with the function
load. The associated pkg.foo.Rd documentation files must
be provided.
- object(s).Rd files the user wants to produce by hand. They
will be used by documair instead of the one based on the tagged
code for (and only for) exported objects. By default, all the objects
are exported, but some can be declared hidden with the
pkg.which.txt file (see below).
- C functions must be stored into individual files with the
same name and extension .c; the same for Fortran functions
with extension .f.
- An optional pkg.which.txt file allows the user to override
the standard use of files and functions to prepare different versions of
the package with the same set of code files. It gives the possibility to
hide or not functions in the package as well as to get sets of aliased
objects. For details see the example below.
- Every additional file the author wants to share with the other
users of the package.
The complete content of this directory will be copied in the free
inst directory of the package arborescence. Once this directory
is prepared, the user successively calls the documair functions
prepare8pkg and compile8pkg.
The denomination of documair stands for documentation for
R, 'air' having the same pronunciation as 'R' in French.
Other R packages for generating Rd documentations files and building
packages from comments inserted in R code are available. Two outstanding
examples are roxygen and inlinedocs. The former is based on
header comments, uses powerful parsers and propose interesting analyses
like the call tree of the set of functions. The latter is very light,
using simple tagging in logical places of the code. documair is in
between these two cases, tags are also within the code but are many and
varied giving rise to more possibilities than inlinedocs.
Documenting an object
Here is an example of a simple masked function of documair.
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
r.bd <- function(n1,n2)
#TITLE sequence of increasing numbers
#DESCRIPTION
# This function returns {n1:n2} when {n1<=n2} and<="" span="">
# {numeric(0)} otherwise.
# Quite useful when some insertion must be done within
# a sequence
#DETAILS
#KEYWORDS iteration
#INPUTS
#{n1} <>
#{n2} <>
#[INPUTS]
#VALUE
# {n1:n2} if {n1
# else {numeric(0)}.
#EXAMPLE
# xx <- 1:5;
# for (ii in 1:6) { print(c(xx[bd(1,ii-1)],10,xx[bd(ii,5)]));}
#REFERENCE
#SEE ALSO bf
#CALLING
#COMMENT
#FUTURE
#AUTHOR J.-B. Denis
#CREATED 11_01_12
#REVISED 11_05_21
#--------------------------------------------
{
if (n1 <= n2)="" {return(n1:n2);}<="" span="">
numeric(0);
}
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
One can notice the different tags used to structure the information
provided in the comments lines:
- #<<<<<<<...<<<<<<<< to open the object,
- #TITLE to specify the title of the object,
- #DESCRIPTION to describe the object,
- ...,
- #-------...-------- to close the documentation part
- ...,
- #>>>>>>>...>>>>>>>> to close the object.
Those five tags are the only compulsory ones (Note: the
#DESCRIPTION tag can be missing for the children objects of a set
of aliased objects).=>=n2}>Monitoring <span class="pkg">documair</span>
Introduction
documair can build different packages from the same set of
files by simply selecting which files/objects have to be compiled and
which ones must be proposed or hidden to the end user. This is performed
through the pkg.which.txt text file. An example of such a file
(with comments) is documair.which.txt of the documair
package. If you are generating different packages with the same
functions, it is recommended to change the name of the package, this is
the reason why you can indicate in the pkg.which.txt file other
DESCRIPTION and PRESENTATION files than the standard ones deduced
from the package name. syntax of pkg.which.txt
The documentation of documair was performed by itself. Below is
provided, as an example, a possible documair.which.txt. The
comments introduced in the file are self-sufficient to understand what
are the different possibilities:
#
# created on 14_01_28
# last modified on 14_05_27
#
# + the order of the items is irrelevant
# but they are exploited in that order
# + according to an option, the existence
# of the specified file, objects is
# checked or not.
# + '_ALL_' means all occurences
#
# specifying the description file
<> documair.DESCRIPTION
#
# the Rd file to describe the package
<> documair.package.Rd
#
# specifying the extension for the code files
<> code.r
#
# specifying the extension for the test files
<> test.r
#
# specifying hidden code files
# (in the example, all objects are hidden)
<> _ALL_
#
# specifying exported code files and
# modifying previous prescriptions
<> user.code.r
#
# specifying exported code files containing alias sets
<> exterieur.code.r
#
# specifying hidden objects
# (in the example no specific object should be hidden
# so the item here is suppressed with an '#'.)
#<>
#
# specifying exported objects
# (in the example an object belonging to a hidden file
# (documair0) is exported)
<> documair0
#
# specifying objects for which
# the content will be displayed on the
# screen during the process.
# (the same can be done at the level of the
# files with '<>'.)
<> documair0 display8tags
#
# specifying keywords from the components
# (here 'compile' must be interpreted as
# 'compilation', 'pkg' as 'package',...
# be aware that the two words must be stuck
# with '=' and that a word must not comprise
# any blank. Also that the special word '_NO_'
# means that this component must not appear
# as a keyword.)
<>/=/U
compile=compilation
pkg=package
prepare=preparation
documair=_NO_
#
# end of the which.documair.txt file Aliasing
documair accepts the aliasing of set of objects but some rules
must be followed for that.
- Objects sharing the same alias must be proposed into a single
file, and only those objects should be present in this file.
- The parent object must be in the first position into this file.
- The first alias name of the parent object must be the common alias
- The name of the file must be declared as containing aliased
objects in the (in that case mandatory) pkg.which.txt file
after the tag <>.
The alias Rd file can be either provided by the user or composed
by documair from the documenting tags. When the Rd file is
hand-written, it must be named under the first object (the parent
alias). When the documentation is built by documair, the
descriptions of identical arguments are taken in the first object using
them according to the ordering within the file. Examples
To get more insights about the flexibility of documair, the reader
can have a glance to documair itself since all necessary files are
gathered in the inst directory. In the same directory is prepared
within the script make.r four examples of building package
variations based on documair objects; the first one being
documair itself. The second one (named documair1 proposes
the building of the package without pkg.which.txt file meaning
that all objects are exported. The fourth example (documair3 gives
an example of using C and Fortran functions which can be
not effective for some configurations. Due to minor inconsistencies,
some examples generate warnings. Errors with <span class="pkg">documair</span>
Currently, documair is quite sensitive to errors in the input
files! Some are detected but indications are not always very clear,
others are not detected. For instance the double # in
##{argument} << explanation...>> when describing the arguments of
a function causes a non explicit error. Also, it can be easily affected
by a mismatched parenthesis... To help the user in seeing where the
mistake is located, it is suggested to put the check argument of
prepare8pkg to TRUE and introduce the line
'<> _ALL_' in the used pkg.which.txt file. This
way the interpreted content of each object of the package will be
displayed on the screen during the process with a pause to give an
opportunity to see if everything seems consistent. It is strongly
advised:
- to introduce only standard ascii characters, even in the
comments.
- to test regularly the preparation of a tar.gz with
documair during the development of a package, rather than once at
the end, in order detect more easily the origins of potantial issues.
- to avoid functions with name having more than one dot
(.). It is considered as a method for an S3 object by
documair but only the last dot is taken into account.
- to be aware that the tagging of documair0$tags$v$deb$v
which is
"#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"< span="">.
must be exactly respected as well as those of documair0$tags$v$fin$v
and
"#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
Of course, you can modify them as you wish.
"<>
Naming conventions
Remembering object names in a given package is not always an easy
task, the first reason being their number. To relieve it, we propose to
follow some conventions, if so documair will propose deduced
keywords.
- Names will be composed of name components separated with
digits. For instance print8object has print and
object as components. The number of components can be one,
two,... or more.
- When nouns, the components can be singular or plural, making
differences.
- The separating digits have a meaning:
- [0] pkg0 (object proposed by the package pkg) /0 ~ Object/
- [1] res4objA1objB (and; here 'res' obtained from 'objA' and
'objB') /1 = one = an ~ and/
- [2] a2b (conversion from object a to object b, even if the
conversion is not one-to-one, a reverse function b2a is supposed to
exist) / 2 ~ to/
- [3] series3fun (function fun belongs to the family series) /3 ~
\in/
- [4] trait4object (extract some characteristic from an object) /4
= Four ~ From/
- [5]
- [6] split8text6tag (split a text object [with | by means of]
tags) /6 = sIx ~~ wIth/
- [7] image7path (image path) /upper bar of 7 is similar to an
hyphen used to join two nouns or an adjective and a noun./
- [8] action8object (make an action on an (or several) object(s))
/8 ~ a/
- [9] empty7object9 (is it an empty object?: question mark) /9 ~~
?/
Projected evolution of <span class="pkg">documair</span>
- Make possible to have operator functions like %T%.
- Allow the user not to have too many *.code.r files. For
that, the code files could be first splitted into elementary sub-files
with a splitting tag like #<<<--->>><--->. This would be convenient
when there are numerous aliased object sets. Indeed, currently, each
identically aliased set of objects must be in a distinct file.
- Get the main steps of the algorithm used in the function by
collecting some tag contents within the code (introduced as special
titles) and added either as a special section or as a new paragraph in
the details section.
- Allows the possibility of including files for repeated pieces of
code, at least for one level.
- Allows the introduction of enumerations in the comments.
- As an option, check and impose typographical rules like upper
cases at the beginning and final dot to the argument
description... with some indication in a separate file of the
changes to give the user the opportunity to check them.
- Improve the way aliased objects are documented, allowing
collective fields like titles...
Acknowledgment
The authors want to thank Annie Bouvier and Caroline Bidot for their
useful supports in solving some technical difficulties we had when
elaborating the package.Additional Information
- This package was built with /documair/ package (version 0.6-0)
on 14_09_15
-
There are 65 object(s) in total.
11 are exported
and there exist 54 masked object(s):
analyse8description, code7objects4text6tags, components9, extract8object, make8rd, parse8code, rrrbc, rrrbd, rrrbelong9, rrrbf, rrrdipa, rrrdisplay8k, rrrerreur, rrrexplore8list, rrrfidi9, rrrfile2list, rrrfile2text, rrrfilter8text, rrrform3crop, rrrform3display, rrrform3justify, rrrform3parag, rrrform3repeat, rrrform3title, rrrform3titre, rrrget8comp7list, rrrinterv7belonging, rrrlist2text, rrrlist4text, rrrnow, rrrobject9, rrrparse8text, rrrpause, rrrplaces4text6tags, rrrrbsa0, rrrrbsa7list9, rrrtext2file, rrrtext2list, rrrtext2vma, rrrtext3acceptance, rrrtext3brackets, rrrtext3ij2n, rrrtext3interval, rrrtext3n2ij, rrrtext3places8brackets, rrrtext3places8word, rrrtext3preparation, rrrtext3replace, rrrtext3stext, rrrtext3translate, rrrtexts4text, rrrvma2text, rrrvoid9, write8lyse.
- There were 1 C file(s).
- There were 1 Fortran file(s).
- They were provided through 8 code file(s).