Title: | Update and Manipulate Rd Documentation Objects |
---|---|
Description: | Functions for manipulation of R documentation objects, including functions reprompt() and ereprompt() for updating 'Rd' documentation for functions, methods and classes; 'Rd' macros for citations and import of references from 'bibtex' files for use in 'Rd' files and 'roxygen2' comments; 'Rd' macros for evaluating and inserting snippets of 'R' code and the results of its evaluation or creating graphics on the fly; and many functions for manipulation of references and Rd files. |
Authors: | Georgi N. Boshnakov [aut, cre], Duncan Murdoch [ctb] |
Maintainer: | Georgi N. Boshnakov <[email protected]> |
License: | GPL (>= 2) |
Version: | 2.6.2.9000 |
Built: | 2025-01-14 05:22:43 UTC |
Source: | https://github.com/geobosh/rdpack |
Functions for manipulation of R documentation objects, including functions reprompt() and ereprompt() for updating 'Rd' documentation for functions, methods and classes; 'Rd' macros for citations and import of references from 'bibtex' files for use in 'Rd' files and 'roxygen2' comments; 'Rd' macros for evaluating and inserting snippets of 'R' code and the results of its evaluation or creating graphics on the fly; and many functions for manipulation of references and Rd files.
Package: | Rdpack |
Type: | Package |
Version: | 2.6.2.9000 |
Date: | |
License: | GPL (>= 2) |
LazyLoad: | yes |
Built: | R 4.4.2; ; 2025-01-14 05:22:35 UTC; unix |
Package Rdpack
provides a number of functions for maintenance
of documentation in R packages. Although base R and
package methods
have functions for creation of skeleton
documentation, if a function gets a new argument or a generic gets a
new method, then updating existing documentation is somewhat
inconvenient. This package provides functions that update parts of the
Rd documentation that can be dealt with automatically and leave manual
changes untouched. For example, usage sections for functions are
updated and if there are undescribed arguments, additional items are
put in the ‘arguments’ section.
A set of functions and macros support inclusion of references and citations from BibTeX files in R documentation (Rd and roxygen2). These tools use only facilities provided by base R and package rbibutils (Boshnakov and Putman 2020).
There are also convenience macros for inclusion of evaluated examples
and graphs, which hide some of the hassle of doing this directly with
the underlying \Sexpr
's.
The subsections below give additional details, see also the vignettes.
The main function provided by this package is reprompt
.
There is also a function promptPackageSexpr
for creating
initial skeleton for overall package description such as this help
page.
reprompt
produces a skeleton documentation for the
requested object, similarly to functions like prompt
,
promptMethods
, and promptClass
. Unlike those functions,
reprompt
updates existing documentation (installed or in
an Rd object or file) and produces a skeleton from scratch as a last
resort only. If the documentation object describes more than one
function, all descriptions are updated. Basically,
reprompt
updates things that are generated
automatically, leaving manual editing untouched.
The typical use of reprompt
is with one argument, as in
reprompt(infile = "./Rdpack/man/reprompt.Rd") reprompt(reprompt) reprompt("reprompt")
reprompt
updates the documentation of all objects described in
the Rd object or file, and writes the updated Rd file in the current
working directory, see reprompt
for details. To describe
a new function in an existing Rd file, just add something like
myfun()
and run reprompt to insert the correct signature,
alias, etc. This works also for replacement functions, see
reprompt
for details.
ereprompt
updates the Rd documentation in a file,
overwrites it and opens it in an editor. It calls reprompt
to
do the actual job but has different defaults. Which editor is opened,
is system dependent, see the edit
and
ereprompt
for futher details.
Users who work on Rd files in RStudio can use add-in “Reprompt”
to invoke reprompt
conveniently on an Rd file or on a selected
object in an R source code file, see
RStudio_reprompt
. This add-in was contributed by Duncan
Murdoch.
Users of Emacs/ESS have various options, depending on their workflow.
One approach is to define a key to call ereprompt
on the
file being edited, see
georgisemacs for an
example setup.
promptPackageSexpr
creates a skeleton for a
package overview in file name-package.Rd
. Then the file can be
edited as needed. This function needs to be called only once for a
package since automatic generation of information in
name-package.Rd
is achieved with Sexpr's at build time, not
with verbatim strings (promptPackage
used to insert verbatim
strings but in recent versions of R it also uses macros.).
For example, the source of this help page is file ‘Rdpack-package.Rd’. It was initially produced using
promptPackageSexpr("Rdpack")
The factual information at the beginning of this help topic (the index above, the version and other stuff that can be determined automatically) is kept automatically up to date.
Another set of functions is for management of bibliographic references
in Rd files. The old approach based on function rebib
is fully functional, see below, but the recommended way to insert
references and citations is based on Rd macros.
The provided Rd macros are fully portable and, in particular, work in
Rd files and roxygen2 comments, see insertRef
and
vignette vignette("Inserting_bibtex_references", "Rdpack")
for details and examples.
The Bibtex source for the references and citations produced by the Rd macros is file "REFERENCES.bib", which should be located in the root of the package installation directory. Rdpack needs also to be mentioned in two places in file ‘DESCRIPTION’. These one-off preparation steps are enumerated below:
Put the following line in file ‘DESCRIPTION’:
RdMacros: Rdpack
(If there is already a line starting with 'RdMacros:', add Rdpack to the list on that line.)
Add Rdpack to the list of imports (Imports:
field) in file ‘DESCRIPTION’.
Add the following line to file ‘NAMESPACE’:
importFrom(Rdpack,reprompt)
Alternatively, if devtools is managing your NAMESPACE file, the equivalent roxygen2 line is:
#' @importFrom Rdpack reprompt
Create file "REFERENCES.bib"
in subdirectory
"inst/"
of the package and put the BibTeX references in
that file.
The Rd macro \insertRef
takes two arguments: a BibTeX key and
the name of a package. Thus, \insertRef{key}{package}
inserts
the reference whose key is key
from "REFERENCES.bib" of the
specified package (almost always the one being documented).
Citations can be done with Rd
macro \insertCite
, which inserts citation(s) for one or more
BibTeX keys and records the keys. \insertCiteOnly
is similar
to \insertCite
but does not record the
keys. \insertNoCite
records the keys but does not produce
citations.
\insertAllCited
creates a bibliography including
all references recorded by \insertCite
and
\insertNoCite
. It is usually put in section
“References”, something like:
\references{ \insertAllCited{} }
in an Rd file. Don't align the backslash with the second 'e' of
@references
, since roxygen2 may interpret it as verbatim text,
not macro.
The analogous documentation chunk in roxygen2 might look like this:
#' @references #' \insertAllCited{}
Bibliography styles for lists of references are supported as well. Currently the only alternative offered is to use long names (Georgi N. Boshnakov) in place of the default style (Boshnakov GN). More comprehensive alternatives can be included if needed or requested.
Convenience functions makeVignetteReference
and
vigbib
generate Bibtex entries for vignettes.
It is convenient during development to be able to view the
rendered version of the document page being edited.
The function viewRd
renders a documentation file in a
source package and displays it as text or in a browser. It renders
references properly in any workflow, including devtools development
mode (Wickham et al. 2018) in Emacs/ESS, Rstudio, Rgui.
This function is a good candidate to be assigned to a key in editors
which support this.
I created this function (in 2017) since the functions provided by devtools and Emacs/ESS are giving errors when processing pages containing Rd macros.
In the alternative approach, the function rebib
updates
the bibliographic references in an Rd file. Rdpack uses a simple
scheme for inclusion of bibliographic references. The key for each
reference is in a TeX comment line, as in:
\references{ ... % bibentry: key1 % bibentry: key2 ... }
rebib
puts each reference after the line containing its
key. It does nothing if the reference has been put by a previous call
of rebib
. If the Bibtex entry for some references changes, it
may be necessary to update them in the Rd file, as well. Call
rebib
with force = TRUE
to get this effect. There is
also a facility to include all references from the Bibtex file, see
the documentation of rebib
for details.
Sometimes the documentation of an object becomes more clear if accompanied by snippets of R
code and their results.
The standard Rd macro \Sexpr
caters for a number of possibilities to evaluate R code and
insert the results and the code in the documentation.
The Rd macro \printExample
provided by package
Rdpack builds on it to print a snippet of R code and the results of its evaluation, similarly to
console output but the code is not prefixed and the results are prefixed with comment
symbols.
For example, \printExample{2+2; a <- 2*3; a}
produces the
following in the rendered documentation:
2 + 2 ##: [1] 4 a <- 2 * 3 a ##: [1] 6
The help page of promptUsage
contains a number of examples created with
\printExample
. The corresponding Rd file can be obtained from the package tarball or from
https://github.com/GeoBosh/Rdpack/blob/master/man/promptUsage.Rd.
The argument of \printExample
must be on a single line with versions of R before
R 3.6.0.
\printExample
is typically placed in section Details of an
object's documentation, see section Details of get_usage
for a number of examples produced mostly with \printExample
.
The macro \runExamples
can be used as a replacement
of section Examples
.
For example, if the following code is put at the top level in an Rd file (i.e. not in a
section):
\runExamples{2+2; a <- 2*3; a}
then it will be evaluated and replaced by a normal section examples:
\examples{ 2 + 2 ##: 4 a <- 2 * 3 a ##: 6 }
This generated examples section is processed by the standard R tools (almost) as if it was there from the outset. In particular, the examples are run by the R's quality control tools and tangled along with examples in other documentation files.
In R versions before 3.6.0 R CMD check
used to give a warning about
unknown \Sexpr
section at top level.
Figures can be inserted with the help of the standard Rd markup command
\figure
. The Rd macro \insertFig
provided by package
Rdpack takes a snipped of R code, evaluates it and inserts the
plot produced by it (using \figure
). \insertFig
takes
three arguments: a filename, the package name and the code to evaluate
to produce the figure. For example,
\insertFig{cars.png}{mypackage}{x <- cars$speed; y <- cars$dist; plot(x,y)}
will evaluate the code, save the graph in file "man/figures/cars.png"
subdirectory of
package "mypackage"
, and include the figure using \figure
.
Subdirectory "figures"
is created if it doesn't exist.
Currently the graphs are saved in "png"
format only.
In older versions of R the code should be on a single line for the reasons explained in the
discussion of \printExample
.
The sister macro \makeFig
creates the graph in exactly the same
way as \insertFig
but does not insert it. This can be done with a
separate \figure
command. This can be used if additional options are
desired for different output formats, see the description of \figure
in "Writing R extensions".
Other functions that may be useful are Rdo2Rdf
, Rdapply
and Rd_combo
. Here is also brief information about some more
technical functions that may be helpful in certain circumstances.
get_usage
generates usage text for functions and
methods. The functions can be located in environments or other
objects. This may be useful for description of function elements of
compound objects.
c_Rd
concatenates Rd pieces, character strings and lists
to create a larger Rd piece or a complete Rd object.
list_Rd
is similar to c_Rd
but provides
additional features for convenient assembling of Rd objects.
parse_Rdpiece
is a technical function for parsing pieces
of Rd source text but it has an argument to return formatted help text
which may be useful when one wishes to show it to the user.
Rdo_set_section
can be used to set a section, such as
"\author
".
The remaining functions in the package are for programming with Rd objects.
All processing is done on the parsed Rd objects, i.e. objects of class "Rd" or pieces of such objects (Murdoch 2010).
The following terminology is used (todo: probably not yet consistently) throughout the documentation.
"Rd object" - an object of class Rd, or part of such object.
"Rd piece" - part of an object of class Rd. Fragment is also used but
note that parse_Rd
defines fragment more restrictively.
"Rd text", "Rd source text", "Rd format" - these refer to the text of the Rd files.
Georgi N. Boshnakov [aut, cre], Duncan Murdoch [ctb]
Maintainer: Georgi N. Boshnakov <[email protected]>
Note: Reference ZZZ (2018) does not exist. It is a test that simple math in BibTeX entries works.
—
Georgi
N. Boshnakov, Chris Putman (2020).
rbibutils: Convert Between Bibliography Formats.
https://CRAN.R-project.org/package=rbibutils.
Duncan Murdoch (2010).
“Parsing Rd files.”
https://developer.r-project.org/parseRd.pdf.
Hadley Wickham, Jim Hester, Winston Chang (2018).
devtools: Tools to Make Developing R Packages Easier.
R package version 1.13.5, https://CRAN.R-project.org/package=devtools.
A. ZZZ (2018).
“A relation between several fundamental constants: ; Also, a test that slash is fine: Something/Something.”
A non-existent journal with the formula
in its name & an ampersand which is preceded by a backslash in the bib file..
This reference does not exist. It is a test/demo that simple formulas in BibTeX files are OK. A formula in field 'note':
.
ereprompt
,
reprompt
,
promptPackageSexpr
,
rebib
,
viewRd
,
vigbib
,
makeVignetteReference
,
vignette("Inserting_bibtex_references", package = "Rdpack")
,
vignette("Inserting_figures_and_evaluated_examples", package = "Rdpack")
## The examples below show typical use but are not executable. ## For executable examples see the help pages of ## reprompt, promptPackageSexpr, and rebib. ## To make the examples executable, replace "myfun" with a real ## function, and similarly for classes and paths to files. ## Not run: ## update the doc. from the Rd source and save myfun.Rd ## in the current directory (like prompt) reprompt(infile="path/to/mypackage/man/myfun.Rd") ## update doc of myfun() from the installed doc (if any); ## if none is found, create it like prompt reprompt("myfun") reprompt(myfun) # same ## update doc. for S4 methods from Rd source reprompt(infile="path/to/mypackage/man/myfun-methods.Rd") ## update doc. for S4 methods from installed doc (if any); ## if none is found, create it like promptMethods reprompt("myfun", type = "methods") reprompt("myfun-methods") # same ## update doc. for S4 class from Rd source reprompt(infile="path/to/mypackage/man/myclass-class.Rd") ## update doc. of S4 class from installed doc. ## if none is found, create it like promptClass reprompt("myclass-class") reprompt("myclass", type = "class") # same ## create a skeleton "mypackage-package.Rd" promptPackageSexpr("mypackage") ## update the references in "mypackage-package.Rd" rebib(infile="path/to/mypackage/man/mypackage-package.Rd", force=TRUE) ## End(Not run)
## The examples below show typical use but are not executable. ## For executable examples see the help pages of ## reprompt, promptPackageSexpr, and rebib. ## To make the examples executable, replace "myfun" with a real ## function, and similarly for classes and paths to files. ## Not run: ## update the doc. from the Rd source and save myfun.Rd ## in the current directory (like prompt) reprompt(infile="path/to/mypackage/man/myfun.Rd") ## update doc of myfun() from the installed doc (if any); ## if none is found, create it like prompt reprompt("myfun") reprompt(myfun) # same ## update doc. for S4 methods from Rd source reprompt(infile="path/to/mypackage/man/myfun-methods.Rd") ## update doc. for S4 methods from installed doc (if any); ## if none is found, create it like promptMethods reprompt("myfun", type = "methods") reprompt("myfun-methods") # same ## update doc. for S4 class from Rd source reprompt(infile="path/to/mypackage/man/myclass-class.Rd") ## update doc. of S4 class from installed doc. ## if none is found, create it like promptClass reprompt("myclass-class") reprompt("myclass", type = "class") # same ## create a skeleton "mypackage-package.Rd" promptPackageSexpr("mypackage") ## update the references in "mypackage-package.Rd" rebib(infile="path/to/mypackage/man/mypackage-package.Rd", force=TRUE) ## End(Not run)
Add content to the element of an Rd object or fragment at a given position.
append_to_Rd_list(rdo, x, pos)
append_to_Rd_list(rdo, x, pos)
rdo |
an Rd object |
x |
the content to append, an Rd object or a list of Rd objects. |
pos |
position at which to append |
The element of rdo
at position pos
is replaced by its
concatenation with x
. The result keeps the "Rd_tag" of
rdo[[pos]]
.
Argument pos
may specify a position at any depth of the Rd
object.
This function is relatively low level and is mainly for use by other functions.
the modified rdo
object
Georgi N. Boshnakov
#rdoseq <- utils:::.getHelpFile(help("seq")) rdoseq <- Rdo_fetch("seq", "base") iusage <- which(tools:::RdTags(rdoseq) == "\\usage") iusage attr(rdoseq[[iusage]], "Rd_tag") ## append a new line after the last usage line rdoseq2 <- append_to_Rd_list(rdoseq, list(Rdo_newline()), iusage) ## Suppose that we wish to describe the function 'sequence' in the same Rd file. ## We append an usage statement for 'sequence()', without worrying about its ## actual signature. rdoseq2 <- append_to_Rd_list(rdoseq2, list(Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq2) ## the two operations can be done in one step rdoseq3 <- append_to_Rd_list(rdoseq, list(Rdo_newline(), Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq3) ## now run reprompt() to update rdoseq3, namely: ## (1) it corrects the signature of 'sequence' in section \usage. ## (2) reports new argument "nvec" ## (3) inserts \item for the new argument(s) in section \arguments. reprompt(rdoseq3, filename=NA)
#rdoseq <- utils:::.getHelpFile(help("seq")) rdoseq <- Rdo_fetch("seq", "base") iusage <- which(tools:::RdTags(rdoseq) == "\\usage") iusage attr(rdoseq[[iusage]], "Rd_tag") ## append a new line after the last usage line rdoseq2 <- append_to_Rd_list(rdoseq, list(Rdo_newline()), iusage) ## Suppose that we wish to describe the function 'sequence' in the same Rd file. ## We append an usage statement for 'sequence()', without worrying about its ## actual signature. rdoseq2 <- append_to_Rd_list(rdoseq2, list(Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq2) ## the two operations can be done in one step rdoseq3 <- append_to_Rd_list(rdoseq, list(Rdo_newline(), Rdo_Rcode("sequence()")), iusage) Rdo_show(rdoseq3) ## now run reprompt() to update rdoseq3, namely: ## (1) it corrects the signature of 'sequence' in section \usage. ## (2) reports new argument "nvec" ## (3) inserts \item for the new argument(s) in section \arguments. reprompt(rdoseq3, filename=NA)
Concatenates Rd objects or pieces
c_Rd(...)
c_Rd(...)
... |
objects to be concatenated, Rd objects or character strings, see ‘Details’. |
The arguments may be a mixture of lists and character strings. The
lists are typically "Rd" objects or pieces. The character strings may
also be elements of "Rd" objects carrying "Rd_tag" attributes. The
"Rd_tag" attribute of character strings for which it is missing is set
to "TEXT". Finally, each character element of "\dots"
is
enclosed in list
.
Eventually all arguments become lists and they are concatenated using
c()
. If any of the arguments is of class "Rd", the class of the
result is set to "Rd". Otherwise, the "Rd_tag" of the result is set to
the first (if any) non-null "Rd_tag" in the arguments.
The structure of "Rd" objects is described by Murdoch (2010).
An Rd object or a list whose attribute "Rd_tag" is set as descibed in ‘Details’
Georgi N. Boshnakov
Duncan Murdoch (2010). “Parsing Rd files.” https://developer.r-project.org/parseRd.pdf.
a1 <- char2Rdpiece("Dummyname", "name") a2 <- char2Rdpiece("Dummyallias1", "alias") a3 <- char2Rdpiece("Dummy title", "title") a4 <- char2Rdpiece("Dummy description", "description") ## The following are equivalent ## (gbRd::Rdo_empty() creates an empty list of class 'Rd') if(requireNamespace("gbRd")){ b1 <- c_Rd(gbRd::Rdo_empty(), list(a1), list(a2), list(a3), list(a4)) c1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2, a3, a4)) d1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), list(a3, a4)) identical(c1, b1) identical(c1, d1) Rdo_show(b1) ## insert a newline d1n <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), Rdo_newline(), list(a3, a4)) str(d1n) } ## When most of the arguments are character strings ## the function 'list_Rd' may be more convenient. u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) Rdo_show(u1)
a1 <- char2Rdpiece("Dummyname", "name") a2 <- char2Rdpiece("Dummyallias1", "alias") a3 <- char2Rdpiece("Dummy title", "title") a4 <- char2Rdpiece("Dummy description", "description") ## The following are equivalent ## (gbRd::Rdo_empty() creates an empty list of class 'Rd') if(requireNamespace("gbRd")){ b1 <- c_Rd(gbRd::Rdo_empty(), list(a1), list(a2), list(a3), list(a4)) c1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2, a3, a4)) d1 <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), list(a3, a4)) identical(c1, b1) identical(c1, d1) Rdo_show(b1) ## insert a newline d1n <- c_Rd(gbRd::Rdo_empty(), list(a1, a2), Rdo_newline(), list(a3, a4)) str(d1n) } ## When most of the arguments are character strings ## the function 'list_Rd' may be more convenient. u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) Rdo_show(u1)
Convert a character vector to Rd piece.
char2Rdpiece(content, name, force.sec = FALSE)
char2Rdpiece(content, name, force.sec = FALSE)
content |
a character vector. |
name |
name of an Rd macro, a string. |
force.sec |
TRUE or FALSE, see ‘Details’. |
Argument content
is converted to an Rd piece using
name
to determine the format of the result.
The Rd tag
of content
is set as appropriate for name
.
More specifically, if name
is the name of a macro (without the
leading '\
') whose content has a known "Rdtag", that tag is
used. Otherwise the tag is set to "TEXT".
If force.sec
is TRUE, name
is treated as the name of a
top level section of an Rd object. A top level section is exported as
one argument macro if it is a standard section (detected with
is_Rdsecname
) and as the two argument macro
"\section
" otherwise.
If force.sec
is FALSE, the content is exported as one argument
macro without further checks.
This function does not attempt to escape special symbols like ‘%’.
Georgi N. Boshnakov
## add a keyword section a1 <- char2Rdpiece("graphics", "keyword") a1 ## "keyword" is a standard Rd top level section, so 'force.sec' is irrelevant a2 <- char2Rdpiece("graphics", "keyword", force.sec = TRUE) identical(a1, a2) ## an element suitable to be put in a "usage" section char2Rdpiece("log(x, base = exp(1))", "usage") ## a user defined section "Todo" char2Rdpiece("Give more examples for this function.", "Todo", force.sec = TRUE)
## add a keyword section a1 <- char2Rdpiece("graphics", "keyword") a1 ## "keyword" is a standard Rd top level section, so 'force.sec' is irrelevant a2 <- char2Rdpiece("graphics", "keyword", force.sec = TRUE) identical(a1, a2) ## an element suitable to be put in a "usage" section char2Rdpiece("log(x, base = exp(1))", "usage") ## a user defined section "Todo" char2Rdpiece("Give more examples for this function.", "Todo", force.sec = TRUE)
Compare usage entries for a function to its actual arguments.
compare_usage1(urdo, ucur)
compare_usage1(urdo, ucur)
urdo |
usage text for a function or S3 method from an Rd object or file. |
ucur |
usage generated from the actual object. |
Compares the usage statements for functions in the Rd object or file
urdo
to the usage inferred from the actual definitions of the
functions. The comparison is symmetric but the interpretation assumes
that ucur
may be more recent.
Note: do not compare the return value to TRUE with identical
or
isTRUE
. The attribute makes the returned value not identical to
TRUE in any case.
TRUE if the usages are identical, FALSE otherwise.
The return value has attribute "details", which is a list providing
details of the comparison. The elements of this list should be
referred by name, since if one of urdo
or ucur
is NULL
or NA, the list contains only the fields "obj_removed", "obj_added",
"rdo_usage", "cur_usage", and "alias".
identical_names |
a logical value, TRUE if the ‘name’ is the same in both objects. |
obj_removed |
names present in |
obj_added |
names present in |
identical_argnames |
a logical value, TRUE if the argument names in both objects are the same. |
identical_defaults |
a logical value, TRUE if the defaults for the arguments in both objects are the same. |
identical_formals |
a logical value, TRUE if the formals
are the same, i.e. fields |
added_argnames |
names of arguments in |
removed_argnames |
names of arguments in |
names_unchanged_defaults |
names of arguments whose defaults are the same. |
rdo_usage |
a copy of |
cur_usage |
a copy of |
alias |
alias of the name of the object, see ‘Details’. |
Georgi N. Boshnakov
Converts f_usage objects to text appropriate for usage sections in Rd files. Handles S3 methods.
deparse_usage(x) deparse_usage1(x, width = 72) ## S3 method for class 'f_usage' as.character(x, ... )
deparse_usage(x) deparse_usage1(x, width = 72) ## S3 method for class 'f_usage' as.character(x, ... )
x |
an object from class |
width |
maximal width of text on a line. |
... |
ignored. |
Both, deparse_usage1
and the as.character
method for
class "f_usage"
, convert an "f_usage"
object to a
character string suitable for Rd documentation. The
as.character
method is the user level function (it just calls
deparse_usage1
), deparse_usage1
is internal function for
programming. In the example below the first command creates an
"f_usage"
object, then the second converts it to character string.
(a <- pairlist2f_usage1(formals(cor), "cor")) ##: name = cor ##: S3class = ##: S4sig = ##: infix = FALSE ##: fu = TRUE ##: argnames = x y use method ##: defaults : y = NULL ##: use = "everything" ##: method = c("pearson", "kendall", "spearman") cat(as.character(a)) ##: cor(x, y = NULL, use = "everything", ##: method = c("pearson", "kendall", "spearman"))
Each usage entriy is formatted and, if necessary, split over several
lines. The width (number of characters) on a line can be changed with
argument width
.
deparse_usage
can be used when x
is a list of
"f_usage"
objects. It calls deparse_usage1
with each of
them and returns a character vector with one element for each
component of x
. When x
is an object from class
"f_usage"
, deparse_usage
is equivalent to
deparse_usage1
.
For deparse_usage1
and as.character.f_usage
, a named
character vector of length one (the name is the function name).
For deparse_usage
, a named character vector with one entry for
the usage text for each function.
Georgi N. Boshnakov
cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## prepare a list of "f_usage" objects fnseq <- reprompt(seq) # get and save the help page of "seq" rdoseq <- tools::parse_Rd(fnseq) # parse the Rd file ut <- get_usage_text(rdoseq) # get the contents of the usage section cat(ut, "\n") # of seq() (a character string) utp <- parse_usage_text(ut) # parse to a list of "f_usage" objects ## deparse the "f_usage" list - each statement gets a separate string cat(deparse_usage(utp), sep = "\n") ## explore some of the usage entries individually; ## the generic seq() has a boring signature utp[[1]] as.character(utp[[1]]) deparse_usage1(utp[[1]]) # same ## the default S3 method is more interesting utp[[2]] cat(deparse_usage1(utp[[2]])) cat(as.character(utp[[2]])) # same unlink(fnseq) setwd(cur_wd) unlink(tmpdir)
cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## prepare a list of "f_usage" objects fnseq <- reprompt(seq) # get and save the help page of "seq" rdoseq <- tools::parse_Rd(fnseq) # parse the Rd file ut <- get_usage_text(rdoseq) # get the contents of the usage section cat(ut, "\n") # of seq() (a character string) utp <- parse_usage_text(ut) # parse to a list of "f_usage" objects ## deparse the "f_usage" list - each statement gets a separate string cat(deparse_usage(utp), sep = "\n") ## explore some of the usage entries individually; ## the generic seq() has a boring signature utp[[1]] as.character(utp[[1]]) deparse_usage1(utp[[1]]) # same ## the default S3 method is more interesting utp[[2]] cat(deparse_usage1(utp[[2]])) cat(as.character(utp[[2]])) # same unlink(fnseq) setwd(cur_wd) unlink(tmpdir)
Update an Rd file and open it in an editor. This is a wrapper for reprompt with different defaults for some parameters.
ereprompt(..., edit = TRUE, filename = TRUE)
ereprompt(..., edit = TRUE, filename = TRUE)
... |
passed on to |
edit |
if |
filename |
if |
ereprompt
calls reprompt
to do the actual job but has
different defaults for the arguments described on this page. By
default, it replaces the original Rd file with the updated
documentation and opens it in an editor.
called for the side effect of updating Rd documentation file and opening it in an editor
Georgi N. Boshnakov
reprompt
which does the actual work
## this assumes that the current working directory is ## in any subdirectory of the development directory of Rdpack ## Not run: ereprompt(infile = "reprompt.Rd") ## End(Not run)
## this assumes that the current working directory is ## in any subdirectory of the development directory of Rdpack ## Not run: ereprompt(infile = "reprompt.Rd") ## End(Not run)
Formats the usage text of a function so that each line contains no more than a given number of characters.
format_funusage(x, name = "", width = 72, realname)
format_funusage(x, name = "", width = 72, realname)
x |
a character vector containing one element for each argument of the function, see ‘Details’. |
name |
the name of the function whose usage is described, a string. |
width |
maximal width of each line of output. |
realname |
the printed form of |
format_funusage
formats the usage text of a function for
inclusion in Rd documentation files. If necessary, it splits the text
into more lines in order to fit it within the requested width.
Each element of argument x
contains the text for one argument
of function name
in the form arg
or arg = default
.
format_funusage
does not look into the content of
x
, it does the necessary pasting to form the complete usage
text, inserting new lines and indentation to stay within the specified
width. Elements of x
are never split. If an argument (i.e.,
element of x
) would cause the width to be exceeded, the entire
argument is moved to the following line.
The text on the second and subsequent lines of each usage item starts in the column just after the opening parenthesis which follows the name of the function on the first line.
In descriptions of S3 methods and S4 methods, argument name
may
be a TeX macro like \method{print}{ts}
. In that case the number
of characters in name
has little bearing on the actual number
printed. In this case argument realname
is used for counting
both the number of characters on the first line of the usage message
and the indentation for the subsequent lines.
The formatted text as a length one character vector.
Only the width of realname
is used (for counting). The
formatted text contains name
.
The width of strings is determined by calling nchar
with
argument type
set to "width".
Georgi N. Boshnakov
# this function is essentially internal, # see deparse_usage1 and as.character.f_usage which use it.
# this function is essentially internal, # see deparse_usage1 and as.character.f_usage which use it.
Get all references from a Bibtex file.
get_bibentries(..., package = NULL, bibfile = "REFERENCES.bib", url_only = FALSE, stop_on_error = TRUE)
get_bibentries(..., package = NULL, bibfile = "REFERENCES.bib", url_only = FALSE, stop_on_error = TRUE)
... |
arguments to be passed on to the file getting functions, character strings, see ‘Details’. |
package |
name of a package, a character string or NULL. |
bibfile |
name of a Bibtex file, a character string. |
url_only |
if TRUE, restrict percent escaping to BibTeX field |
stop_on_error |
if |
get_bibentries
parses the specified file.
and sets its
names
attribute to the keys of the bib elements
(read.bib()
does this since version version 0.4.0 of
bibtex, as well). Here is what
get_bibentries
does on top of read.bib
(the details are
further below):
get_bibentries
deals with percent signs in URL's.
if the current working directory is in the development
directory of package
, get_bibentries
will first
search for the bib file under that directory.
bibfile
should normally be the base name of the Bibtex file.
Calling get_bibentries
without any "\dots"
arguments
results in looking for the Bibtex file in the current directory if
package is NULL or missing, and in the installation directory of the
specified package, otherwise.
Argument "..." may be used to specify directories.
If package
is missing or NULL, the complete path is obtained
with file.path(..., bibfile)
. Otherwise package
must be
a package name and the file is taken from the installation directory
of the package. Again, argument "..." can specify subdirectory
as in system.file
.
If the current working directory is in the development directory of
package
, the bib file is first sought there before resorting to
the installation directory.
Although the base R packages do not have files REFERENCES.bib,
argument package
can be set to one of them,
e.g. "base"
. This works since package bibtex provides bib
files for the core packages.
By default, get_bibentries
escapes unescaped percent signs in
all fields of bibtex objects. To restrict this only to field "url",
set argument url_only
to FALSE
.
get_bibentries
returns an object from class
"bibentryRd"
, which inherits from bibentry. The printing method
for "bibentryRd"
unescapes percent signs in URLs for some
styles where the escapes are undesirable.
a bibentryRd object inheriting from bibentry
Georgi N. Boshnakov
There are no references for Rd macro \insertAllCites
on this help page.
r <- get_bibentries(package = "Rdpack") r print(r, style = "html") ## Bib from base R packages are disabled in Rdpack v2 (notify the ## maintainer of Rdpack or raise an issue on github if you wish this back). ## ## b <- get_bibentries(package = "stats") ## print(b[[1]], style = "R") ## print(b[[1]], style = "citation") ## here the url field contains percent encoding fn_url <- system.file("examples", "url_with_percents.bib", package = "Rdpack") u <- get_bibentries(bibfile = fn_url) ## the links produced by all of the following are valid ## and can be put in a browser print(u, style = "html") print(u, style = "bibtex") print(u, style = "R") print(u, style = "text") print(u, style = "citation") ## The link here contains escapes but when put in a LaTeX document ## which uses the JSS style it generates correct clickable link, ## (see Details section) print(u, style = "latex") ## here the journal field contains percent encoding fn_other <- system.file("examples", "journal_with_percents.bib", package = "Rdpack") j <- get_bibentries(bibfile = fn_url) print(j, style = "html") print(j, style = "bibtex") print(j, style = "R") print(j, style = "text") print(j, style = "citation") print(j, style = "latex")
r <- get_bibentries(package = "Rdpack") r print(r, style = "html") ## Bib from base R packages are disabled in Rdpack v2 (notify the ## maintainer of Rdpack or raise an issue on github if you wish this back). ## ## b <- get_bibentries(package = "stats") ## print(b[[1]], style = "R") ## print(b[[1]], style = "citation") ## here the url field contains percent encoding fn_url <- system.file("examples", "url_with_percents.bib", package = "Rdpack") u <- get_bibentries(bibfile = fn_url) ## the links produced by all of the following are valid ## and can be put in a browser print(u, style = "html") print(u, style = "bibtex") print(u, style = "R") print(u, style = "text") print(u, style = "citation") ## The link here contains escapes but when put in a LaTeX document ## which uses the JSS style it generates correct clickable link, ## (see Details section) print(u, style = "latex") ## here the journal field contains percent encoding fn_other <- system.file("examples", "journal_with_percents.bib", package = "Rdpack") j <- get_bibentries(bibfile = fn_url) print(j, style = "html") print(j, style = "bibtex") print(j, style = "R") print(j, style = "text") print(j, style = "citation") print(j, style = "latex")
Produce the textual form of the signatures of available methods for an S4 generic function.
get_sig_text(rdo, package = NULL)
get_sig_text(rdo, package = NULL)
rdo |
an Rd object. |
package |
if of class "character", give only methods defined by
|
Signatures are found using function findMethodSignatures
from
package "methods".
Here we find all methods for show()
defined in package
"methods"
and print the first few of them:
fn <- utils::help("show-methods", package = "methods") rdo <- utils:::.getHelpFile(fn) head(get_sig_text(rdo)) ##: [1] "signature(object = \"ANY\")" ##: [2] "signature(object = \"MethodDefinition\")" ##: [3] "signature(object = \"MethodDefinitionWithTrace\")" ##: [4] "signature(object = \"MethodSelectionReport\")" ##: [5] "signature(object = \"MethodWithNext\")" ##: [6] "signature(object = \"MethodWithNextWithTrace\")"
A character vector with one element for each method.
todo: It would be better to call promptMethods() to get the signatures but in version R-2.13.x I had trouble with argument ‘where’ (could not figure out how to use it to restrict to functions from a package; also, promptMethods() seemed to call the deprecated function getMethods()). Check how these things stand in current versions of R, there may be no problem any more (checked, in 2.14-0 it is the same).
Georgi N. Boshnakov
## load another package with some S4 methods ("methods" is already loaded) require("stats4") rdo <- Rdo_fetch("show", package = "methods") ## alternatively: #fn <- help("show-methods", package = "methods") #rdo <- utils:::.getHelpFile(fn) ## this will find all methods for "show" in currently loaded packages ## (print only some of them) head(get_sig_text(rdo)) ## this will select only the ones from package "stats4" get_sig_text(rdo, package = "stats4") ## this is also fine (interactively) but need to choose ## the appropriate element of "fn" if length(fn) > 1 #fn <- help("show-methods") ## this finds nothing #fn <- help("logLik-methods", package = "methods") #fn Rdo_fetch("logLik-methods", package = "methods") ## this does #fn <- help("logLik-methods", package = "stats4") #rdo <- utils:::.getHelpFile(fn) rdo2 <- Rdo_fetch("logLik-methods", package = "stats4") get_sig_text(rdo2) get_sig_text(rdo2, package = "stats4") ## only default method defined ## using this: setGeneric("f1", function(x, y){NULL}) ## since the following gives error in pkgdown: #f1 <- function(x, y){NULL} #setGeneric("f1") fn <- tempfile() reprompt("f1", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) setClass("aRdpack") setClass("bRdpack") ## several methods defined setGeneric("f4", function(x, y){NULL}) setMethod("f4", c("numeric", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("bRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "bRdpack"), function(x, y){NULL}) reprompt("f4", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) unlink(fn)
## load another package with some S4 methods ("methods" is already loaded) require("stats4") rdo <- Rdo_fetch("show", package = "methods") ## alternatively: #fn <- help("show-methods", package = "methods") #rdo <- utils:::.getHelpFile(fn) ## this will find all methods for "show" in currently loaded packages ## (print only some of them) head(get_sig_text(rdo)) ## this will select only the ones from package "stats4" get_sig_text(rdo, package = "stats4") ## this is also fine (interactively) but need to choose ## the appropriate element of "fn" if length(fn) > 1 #fn <- help("show-methods") ## this finds nothing #fn <- help("logLik-methods", package = "methods") #fn Rdo_fetch("logLik-methods", package = "methods") ## this does #fn <- help("logLik-methods", package = "stats4") #rdo <- utils:::.getHelpFile(fn) rdo2 <- Rdo_fetch("logLik-methods", package = "stats4") get_sig_text(rdo2) get_sig_text(rdo2, package = "stats4") ## only default method defined ## using this: setGeneric("f1", function(x, y){NULL}) ## since the following gives error in pkgdown: #f1 <- function(x, y){NULL} #setGeneric("f1") fn <- tempfile() reprompt("f1", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) setClass("aRdpack") setClass("bRdpack") ## several methods defined setGeneric("f4", function(x, y){NULL}) setMethod("f4", c("numeric", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("bRdpack", "numeric"), function(x, y){NULL}) setMethod("f4", c("aRdpack", "bRdpack"), function(x, y){NULL}) reprompt("f4", filename = fn) rdo <- tools::parse_Rd(fn) get_sig_text(rdo) unlink(fn)
Get the text of the usage section of Rd documentation.
get_usage_text(rdo)
get_usage_text(rdo)
rdo |
an Rd object or a character string |
If rdo
is a string, it is parsed to obtain an Rd object.
The content of section "\usage
" is extracted and converted to string.
a string
todo: get_usage_text
can be generalised to any Rd section but it is
better to use a different approach since print.Rd()
does not
take care for some details (escaping %, for example). Also, the
functions that use this one assume that it returns R code, which
may not be the case if the usage section contains Rd comments.
Georgi N. Boshnakov
## get the Rd object documenting Rdo_macro #h <- utils::help("Rdo_macro", lib.loc = .libPaths()) #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") # extract the usage section and print it: ut <- get_usage_text(rdo) cat(ut, sep = "\n")
## get the Rd object documenting Rdo_macro #h <- utils::help("Rdo_macro", lib.loc = .libPaths()) #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") # extract the usage section and print it: ut <- get_usage_text(rdo) cat(ut, sep = "\n")
Insert references cited in packages.
insert_all_ref(refs, style = "", empty_cited = FALSE)
insert_all_ref(refs, style = "", empty_cited = FALSE)
refs |
a matrix specifying key-package pairs of the references to insert. Can also be a cached environment, see Details. |
style |
a bibstyle, see Details. |
empty_cited |
if |
insert_all_ref
is the workhorse behind several Rd macros for
inclusion of references in Rd documentation.
Argument refs
is a two-column character matrix. The first
column specifies bibtex keys. To specify more than one key in a
single element, separate them by commas. The second column specifies the
package in which to look for the keys.
A key equal to "*" requests all keys in the corresponding package.
insert_all_ref
drops duplicated keys, collects the references,
and converts them to Rd textual representation for inclusion in Rd
documentation files.
refs
can be a cached environment. This is for internal use and
not documented.
a character string containing a textual representation of the references, suitable for inclusion in an Rd file
Georgi N. Boshnakov
Currently there are no citations on this help page. Nevetheless, I
have put \insertAllCited{}
just after this paragraph to show
the message that it prints when there are no citations. This seems
better than printing nothing but it may be argued also that there
should be a warning as well.
There are no references for Rd macro \insertAllCites
on this help page.
## a reference from package Rdpack cat(insert_all_ref(matrix(c("Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## more than one reference from package Rdpack, separate the keys with commas cat(insert_all_ref(matrix(c("parseRd,Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## all references from package Rdpack cat(insert_all_ref(matrix(c("*", "Rdpack"), ncol = 2)), "\n") ## all references from package Rdpack and rbibutils m <- matrix(c("*", "Rdpack", "*", "rbibutils"), ncol = 2, byrow = TRUE) cat(insert_all_ref(m), "\n")
## a reference from package Rdpack cat(insert_all_ref(matrix(c("Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## more than one reference from package Rdpack, separate the keys with commas cat(insert_all_ref(matrix(c("parseRd,Rpack:bibtex", "Rdpack"), ncol = 2)), "\n") ## all references from package Rdpack cat(insert_all_ref(matrix(c("*", "Rdpack"), ncol = 2)), "\n") ## all references from package Rdpack and rbibutils m <- matrix(c("*", "Rdpack", "*", "rbibutils"), ncol = 2, byrow = TRUE) cat(insert_all_ref(m), "\n")
Generate citations from bibtex keys.
insert_citeOnly(keys, package = NULL, before = NULL, after = NULL, bibpunct = NULL, ..., cached_env = NULL, cite_only = FALSE, dont_cite = FALSE)
insert_citeOnly(keys, package = NULL, before = NULL, after = NULL, bibpunct = NULL, ..., cached_env = NULL, cite_only = FALSE, dont_cite = FALSE)
keys |
a character string containing bibtex key(s) prefixed with the symbol
|
package |
name of an R package. |
before |
see |
after |
see |
bibpunct |
see |
... |
further arguments; for internal use. |
cached_env |
for internal use. |
cite_only |
for internal use. |
dont_cite |
for internal use. |
This is the function behind \insertCite
and related macros.
Argument "keys"
has the syntax of the first argument of
\insertCite
, see insertRef
for full details.
a character vector containing the references with Rd markup
Georgi N. Boshnakov
insert_ref
for description of all available Rd macros
insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd", package = "Rdpack") ## (see also Boshnakov and Putman 2020 and Murdoch 2010) insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd;nobrackets", package = "Rdpack") ## see also Boshnakov and Putman 2020 and Murdoch 2010 insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd;textual", package = "Rdpack") ## see also Boshnakov and Putman (2020) and Murdoch (2010)
insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd", package = "Rdpack") ## (see also Boshnakov and Putman 2020 and Murdoch 2010) insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd;nobrackets", package = "Rdpack") ## see also Boshnakov and Putman 2020 and Murdoch 2010 insert_citeOnly("@see also @Rpackage:rbibutils and @parseRd;textual", package = "Rdpack") ## see also Boshnakov and Putman (2020) and Murdoch (2010)
Package Rdpack provides Rd macros for inserting references and
citations from bibtex files into R documentation. Function
insert_ref()
is the workhorse behind this mechanism. The
description given on this page should be sufficient, for more details
see the vignette.
insert_ref(key, package = NULL, ..., cached_env = NULL)
insert_ref(key, package = NULL, ..., cached_env = NULL)
key |
the bibtex key of the reference, a character string. |
package |
the package in which to look for the bibtex file. |
... |
further arguments to pass on to |
cached_env |
environment, used to avoid repeatedly passing the bib file from scratch, mainly used by the Rd macros. |
insert_ref
extracts a bibliograhic reference from a bibtex
file, converts it to Rd format and returns a single string with
embedded newline characters. It is the workhorse in the provided
mechanism but most users do not even need to know about
insert_ref
.
Package Rdpack provides several Rd macros for inserting
references and citations in the documentation of a package. All macros
work in both, manually written Rd files and in roxygen2
documentation chunks. The macros look for references in file
"REFERENCES.bib"
in the root of the installation directory of
the package. When a package is in development mode under
devtools, "inst/REFERENCES.bib"
in the development
directory of the package is checked first. See also
get_bibentries
but note that while direct calls to
insert_ref()
can specify a different file, the filename and the
places where it is looked for are fixed for the Rd macros.
The description below assumes that Rdpack has been added to file
DESCRIPTION, as described in Rdpack-package
and vignette
"Inserting_bibtex_references"
. The Rd macros are put in the
text of documentation sources (‘Rd’ files or ‘roxygen2’
chunks).
\insertRef{key}{package}
inserts the reference with bibtex key
key
from file "REFERENCES.bib"
in package
package
. Argument ‘package’ can be any installed R
package, not necessarily the one of the documentation object, as long
as it contains file "REFERENCES.bib"
in the root of its
installation directory. The references are partially processed when
the package is built.
References inserted with \insertRef
appear in the place where
the macro is put, usually in a dedicated references section
(\references
in Rd files, @references
in roxygen
chunks).
For example, section ‘References’ of this help page shows (among other things)) the rendered results of the following lines in the Rd source file:
\insertRef{Rpackage:rbibutils}{Rdpack} \insertRef{parseRd}{Rdpack} \insertRef{bibutils6.10}{rbibutils}
A roxygen2 documentation chunk might look like this:
#' @references #' \insertRef{Rpackage:rbibutils}{Rdpack} #' #' \insertRef{parseRd}{Rdpack} #' #' \insertRef{bibutils6.10}{rbibutils}
The first reference has label Rpackage:rbibutils
and is taken
from file "REFERENCES.bib"
in package Rdpack. The third
reference is from the file "REFERENCES.bib"
in package
rbibutils.
For more details see vignette "Inserting_bibtex_references"
.
\insertCite{key}{package}
cites the key and records it for use
by \insertAllCited
, see below. key
can contain more
keys separated by commas.
\insertCite{parseRd,Rpackage:rbibutils}{Rdpack} |
(Murdoch 2010; Boshnakov and Putman 2020) |
\insertCite{Rpackage:rbibutils}{Rdpack} |
(Boshnakov and Putman 2020) |
\insertCite{bibutils6.10}{rbibutils} |
(Putnam 2020) |
By default the citations are parenthesised
(Murdoch 2010). To get textual citations, like
Murdoch (2010), put the string ;textual
at the end of the key. The references in the last two sentences were
produced with \insertCite{parseRd}{Rdpack}
and
\insertCite{parseRd;textual}{Rdpack}
, respectively. This
also works with several citations, e.g.
\insertCite{parseRd,Rpackage:rbibutils;textual}{Rdpack}
produces: Murdoch (2010); Boshnakov and Putman (2020).
To mix the citations with other text, such as ‘see also’ and
‘chapter 3’, write the list of keys as free text, starting it
with the symbol @
and prefixing each key with it. The
@
symbol will not appear in the output. For example, the
following code
\insertCite{@see also @parseRd and @Rpackage:rbibutils}{Rdpack}, \insertCite{@see also @parseRd; @Rpackage:rbibutils}{Rdpack}, \insertCite{@see also @parseRd and @Rpackage:rbibutils;textual}{Rdpack}.
produces:
(see also Murdoch 2010 and Boshnakov and Putman 2020), |
(see also Murdoch 2010; Boshnakov and Putman 2020), |
see also Murdoch (2010) and Boshnakov and Putman (2020). |
In the parenthesised form, adding ;nobrackets
at the end of the
list of keys causes the enclosing parentheses to be dropped. This is
useful if you wish to use markup for the text surrounding the
references. For example,
(\emph{see also} \insertCite{@@parseRd; @Rpackage:rbibutils;nobrackets}{Rdpack}).
gives: (see also Murdoch 2010; Boshnakov and Putman 2020).
Without ‘;nobrackets
’ the result would be
(see also (Murdoch 2010; Boshnakov and Putman 2020)).
The macro \insertNoCite{key}{package}
records one or more
references for \insertAllCited
but does not cite it. Setting
key
to *
will include all references from the specified
package. For example, \insertNoCite{parseRd}{Rdpack}
and
\insertNoCite{*}{rbibutils}
record the specified references
for inclusion by \insertAllCited
.
\insertAllCited
inserts all references cited with
\insertCite
and \insertNoCite
. Putting this macro
in the references section will keep the references up to date automatically.
The Rd section may look something like:
\references{ \insertAllCited{} }
or in roxygen2, the references chunk might look like this:
#' @references #' \insertAllCited{}
\insertCiteOnly{key}{package}
is as \insertCite
but
does not include the key in the list of references for
\insertAllCited
.
for insert_ref
, a character string
Georgi N. Boshnakov
For illustrative purposes there are two sets of citations below
The first set of references is obtained with \insertRef
for
each reference:
Duncan Murdoch (2010). “Parsing Rd files.” https://developer.r-project.org/parseRd.pdf.
Georgi N. Boshnakov, Chris Putman (2020). rbibutils: Convert Between Bibliography Formats. https://CRAN.R-project.org/package=rbibutils.
Putnam C (2020). “Library bibutils, version 6.10.” https://sourceforge.net/projects/bibutils/.
—-
The following references are obtained with a single \insertAllCited{}
.
The references are sorted automatically by the surnames of the authors:
Georgi
N. Boshnakov, Chris Putman (2020).
rbibutils: Convert Between Bibliography Formats.
https://CRAN.R-project.org/package=rbibutils.
Duncan Murdoch (2010).
“Parsing Rd files.”
https://developer.r-project.org/parseRd.pdf.
Chris Putnam (2020).
“Library bibutils, version 6.10.”
https://sourceforge.net/projects/bibutils/.
Rdpack-package
for overview,
vignette("Inserting_bibtex_references", package = "Rdpack")
for
further details on the citation macros
insert_citeOnly
for the function generating citations
cat(insert_ref("Rpackage:rbibutils", "Rdpack"), "\n")
cat(insert_ref("Rpackage:rbibutils", "Rdpack"), "\n")
Inspect the argument section of an Rd object.
inspect_args(rdo, i_usage)
inspect_args(rdo, i_usage)
rdo |
an Rd object describing functions. |
i_usage |
see Details. |
inspect_args
checks if the arguments in the documentation
object rdo
match the (union of) the actual arguments of the
functions it describes.
If i_usage
is missing, it is computed by inspecting the current
definitions of the functions described in rdo
, see
inspect_usage
. This argument is likely to be supplied if the
function calling inspect_args
has already computed it for other
purposes.
TRUE if the arguments in the documentation match the (union of) the actual arguments of the described functions, FALSE otherwise.
The returned logical value has attribute ‘details’ which is a list with the following components.
rdo_argnames |
arguments described in the documentation object, |
cur_argnames |
arguments in the current definitions of the described functions. |
added_argnames |
new arguments |
removed_argnames |
removed (dropped) arguments. |
Georgi N. Boshnakov
Inspect and update an Rd object or file.
inspect_Rd(rdo, package = NULL) inspect_Rdfun(rdo, alias_update = TRUE) inspect_Rdmethods(rdo, package = NULL) inspect_Rdclass(rdo)
inspect_Rd(rdo, package = NULL) inspect_Rdfun(rdo, alias_update = TRUE) inspect_Rdmethods(rdo, package = NULL) inspect_Rdclass(rdo)
rdo |
an Rd object or file name |
package |
name of a package |
alias_update |
if |
These functions check if the descriptions of the objects in rdo
are consistent with their current definitions and update them, if
necessary. The details depend on the type of the documented topic.
In general, the functions update entries that can be produced
programmatically, possibly accompanied with a suggestion to the author
to write some additional text.
inspect_Rd
checks the \name
section of rdo
and
dispatches to one of the other inspect_XXX
functions depening
on the type of the topic.
inspect_Rdfun
processes documentation of functions. It checks
the usage entries of all functions documented in rdo
and
updates them if necessary. It appends "\alias
" entries for
functions that do not have them. Entries are created for any arguments
that are missing from the "\arguments
" section. Warning is
given for arguments in the "\arguments
" section that are not
present in at least one usage entry. inspect_Rdfun
understands
the syntax for S3 methods and S4 methods used in "usage" sections, as
well. The S4 methods may also be in a section as produced by
promptMethods
.
inspect_Rdmethods
checks and updates documentation of an S4
generic function.
inspect_Rdclass
checks and updates documentation of an S4
class.
Since method signatures and descriptions may be present in
documentation of a class, as well as in that of methods, the question
arises where to put "\alias
" entries to avoid duplication.
Currently, alias entries are put in method descriptions.
Georgi N. Boshnakov
Inspect signatures of S4 methods.
inspect_clmethods(rdo, final = TRUE) inspect_signatures(rdo, package = NULL, sec = "Methods")
inspect_clmethods(rdo, final = TRUE) inspect_signatures(rdo, package = NULL, sec = "Methods")
rdo |
an Rd object. |
package |
the name of a package, a character string or NULL. |
sec |
the name of a section to look into, a character string. |
final |
If not TRUE insert text with suggestions, otherwise comment the suggestions out. |
Signatures in documentation of S4 classes and methods are stored
somewhat differently. inspect_signatures
inspects signatures in
documentation of methods of a function. inspect_clmethods
inspects signatures in documentation of a class.
inspect_signatures
was written before
inspect_clmethods()
and was geared towards using existing code
for ordinary functions (mainly parse_usage_text()
.
If new methods are found, the functions add entries for them in the Rd
object rdo
.
If rdo
documents methods that do not exist, a message inviting
the user to remove them manually is printed but the offending entries
remain in the object.
At the time of writing, R CMD check
does not warn about this.
an Rd object
todo: need consolidation.
Georgi N. Boshnakov
Inspect the slots of an S4 class.
inspect_slots(rdo, final = TRUE)
inspect_slots(rdo, final = TRUE)
rdo |
an Rd object. |
final |
if not TRUE insert text with suggestions, otherwise comment the suggestions out. |
Georgi N. Boshnakov
Inspect the usage section in an Rd object.
inspect_usage(rdo)
inspect_usage(rdo)
rdo |
an Rd object. |
The usage section in the Rd object, rdo
, is extracted and
parsed. The usage of each function described in rdo
is
obtained also from the actual installed function and compared to the
one from rdo
.
The return value is a list, with one element for each function usage
as returned by compare_usage1
.
One of the consequences of this is that an easy way to add a usage
description of a function, say fu
to an existing Rd file is to
simply add a line fu()
to the usage section of that file and
run reprompt
on it.
a list of comparison results as described in ‘Details’ (todo: give more details here)
Georgi N. Boshnakov
Combine Rd fragments and strings into one object.
list_Rd(..., Rd_tag = NULL, Rd_class = FALSE)
list_Rd(..., Rd_tag = NULL, Rd_class = FALSE)
... |
named list of objects to combine, see ‘Details’. |
Rd_tag |
if non-null, a value for the |
Rd_class |
logical; if TRUE, the result will be of class "Rd". |
The names of named arguments specify tags for the corresponding elements (not arbitrary tags, ones that are converted to macro names by prepending backslash to them). This is a convenient way to specify sections, items, etc, in cases when the arguments have not being tagged by previous processing. Character string arguments are converted to the appropriate Rd pieces.
Argument ...
may contain a mixture of character vactors and Rd
pieces.
an Rd object or list with Rd_tag
attribute, as specified by the
arguments.
Georgi N. Boshnakov
## see also the examples for c_Rd dummyfun <- function(x, ...) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", Rd_class=TRUE ) Rdo_show(u1) # call reprompt to fill the arguments section (and correct the usage) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) # check that the result can be parsed and show it. Rdo_show(tools::parse_Rd(fn)) unlink(fn)
## see also the examples for c_Rd dummyfun <- function(x, ...) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", Rd_class=TRUE ) Rdo_show(u1) # call reprompt to fill the arguments section (and correct the usage) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) # check that the result can be parsed and show it. Rdo_show(tools::parse_Rd(fn)) unlink(fn)
Make bibtex references for vignettes
makeVignetteReference(package, vig = 1, verbose = TRUE, title, author, type = "pdf", bibtype = "Article", key = NULL) vigbib(package, verbose = TRUE, ..., vig = NULL)
makeVignetteReference(package, vig = 1, verbose = TRUE, title, author, type = "pdf", bibtype = "Article", key = NULL) vigbib(package, verbose = TRUE, ..., vig = NULL)
package |
a character string, the name of an installed package. |
vig |
an integer number or a character string identifying a vignette. |
verbose |
if |
title |
a character string, title of the vignette, see Details. |
author |
a character string, title of the vignette, see Details. |
type |
a character string, type of the vignette, such as
|
bibtype |
a character string, Bibtex type for the reference,
defaults to |
key |
a character string specifying a key for the Bibtex entry. If missing, suitable key is generated automatically. |
... |
arguments passed by |
vigbib()
generates Bibtex references for all vignettes in a
package. makeVignetteReference()
produces a Bibtex entry for a
particular vignette.
There seems to be no standard way to cite vignettes in R packages.
For vignettes that are complete journal papers (most notably in the
Journal of Statistical Software), the authors would usually
prefer the papers to be cited, rather than the vignette. In any case,
consulting the output of citation("a_package")
is the best
starting point. If the vignette has been extended substantially after
the paper was published, cite both.
In many cases it is sufficient to give the command that opens the vignette, e.g.:
vignette("Inserting_bibtex_references", package = "Rdpack")
.
makeVignetteReference()
makes a Bibtex entry for one
vignette. It looks for the available vignettes using
vignette(package=package)
. Argument vig
can be a
character string identifying the vignette by the name that would be
used in a call to vignette()
. It can also be an integer,
identifying the vignette by the index (in the order in which the
vignettes are returned by vignette()
). By default the first
vignette is returned. If vig
is not suitable, a suitable list
of alternatives is printed.
For vigbib()
it is sufficient to give the name of a package. It
accepts all arguments of makeVignetteReference()
except
vig
(actually, supplying vig
is equivallent to calling
makeVignetteReference()
directly).
The remaining arguments can be used to overwrite some automatically generated entries. For example, the vignette authors may not be the same as the package authors.
a bibentry object containing the generated references (the Bibtex entries are also printed, so that they can be copied to a bib file)
Georgi N. Boshnakov
## NOTE (2020-01-21): the following examples work fine, but are not ## rendered correctly by pkgdown::build_site(), so there may be errors ## on the site produced by it, https://geobosh.github.io/Rdpack/. vigbib("Rdpack") makeVignetteReference("Rdpack", vig = 1) makeVignetteReference("Rdpack", vig = "Inserting_bibtex_references") ## the first few characters of the name suffice: makeVignetteReference("Rdpack", vig = "Inserting_bib") ## this gives an error but also prints the available vignettes: ## makeVignetteReference("Matrix", vig = "NoSuchVignette") vigbib("utils") makeVignetteReference("utils", vig = 1) ## commented out since can be slow: ## high <- installed.packages(priority = "high") ## highbib <- lapply(rownames(high), function(x) try(Rdpack:::vigbib(x, verbose = FALSE)))
## NOTE (2020-01-21): the following examples work fine, but are not ## rendered correctly by pkgdown::build_site(), so there may be errors ## on the site produced by it, https://geobosh.github.io/Rdpack/. vigbib("Rdpack") makeVignetteReference("Rdpack", vig = 1) makeVignetteReference("Rdpack", vig = "Inserting_bibtex_references") ## the first few characters of the name suffice: makeVignetteReference("Rdpack", vig = "Inserting_bib") ## this gives an error but also prints the available vignettes: ## makeVignetteReference("Matrix", vig = "NoSuchVignette") vigbib("utils") makeVignetteReference("utils", vig = 1) ## commented out since can be slow: ## high <- installed.packages(priority = "high") ## highbib <- lapply(rownames(high), function(x) try(Rdpack:::vigbib(x, verbose = FALSE)))
Parse formal arguments of functions and convert them to f_usage objects.
parse_pairlist(x) pairlist2f_usage1(x, name, S3class = "", S4sig = "", infix = FALSE, fu = TRUE)
parse_pairlist(x) pairlist2f_usage1(x, name, S3class = "", S4sig = "", infix = FALSE, fu = TRUE)
x |
a pairlist representing the arguments of a function. |
name |
function name. |
S3class |
S3 class, see ‘Details’ |
S4sig |
S4 signature, see Details. |
infix |
if |
fu |
if TRUE the object is a function, otherwise it is something
else (e.g. a variable or a constant like |
These functions are mostly internal.
parse_pairlist
parses the pairlist object, x
, into a
list with two components. The first component contains the names of
the arguments. The second component is a named list containing the
default values, converted to strings. Only arguments with default
values have entries in the second component (so, it may be of length
zero). If x
is empty or NULL
, both components have
length zero. An example:
parse_pairlist(formals(system.file)) ##: $argnames ##: [1] "..." "package" "lib.loc" "mustWork" ##: $defaults ##: package lib.loc mustWork ##: "\"base\"" "NULL" "FALSE"
pairlist2f_usage1()
creates an object of S3 class
"f_usage"
. The object contains the result of parsing x
with parse_pairlist(x)
and a number of additional components
which are copies of the remaining arguments to the function (without
any processing). The components are listed in section Values.
S3class
is set to an S3 class for for S3 methods, S4sig
is the signature of an S4 method (as used in Rd macro
\S4method
). infix
is TRUE
for the rare occations
when the function is primarily used in infix form.
Class "f_usage"
has a method for as.character()
which
generates a text suitable for inclusion in Rd documentation.
pairlist2f_usage1(formals(summary.lm), "summary", S3class = "lm") ##: name = summary ##: S3class = lm ##: S4sig = ##: infix = FALSE ##: fu = TRUE ##: argnames = object correlation symbolic.cor ... ##: defaults : correlation = FALSE ##: symbolic.cor = FALSE
For parse_pairlist
, a list with the following components:
argnames |
the names of all arguments, a character vector |
defaults |
a named character vector containing the default values, converted to character strings. Only arguments with defaults have entries in this vector. |
For pairlist2f_usage1
, an object with S3 class
"f_usage"
. This is a list as for parse_pairlist
and
the following additional components:
name |
function name, a character string. |
S3class |
S3 class, a character string; |
S4sig |
S4 signature; |
infix |
a logical value, |
fu |
indicates the type of the object, usually |
Georgi N. Boshnakov
promptUsage
accepts f_usage
objects,
get_usage
parse_pairlist(formals(lm)) parse_pairlist(formals(system.file)) s_lm <- pairlist2f_usage1(formals(summary.lm), "summary", S3class = "lm") s_lm as.character(s_lm)
parse_pairlist(formals(lm)) parse_pairlist(formals(system.file)) s_lm <- pairlist2f_usage1(formals(summary.lm), "summary", S3class = "lm") s_lm as.character(s_lm)
Parse the name section of an Rd object.
parse_Rdname(rdo)
parse_Rdname(rdo)
rdo |
an Rd object |
The content of section "\name
" is extracted. If it contains a
hyphen, ‘-’, the part before the hyphen is taken to be the topic
(usually a function name), while the part after the hyphen is the
type. If the name does not contain hyphens, the type is set to the
empty string.
a list with two components:
fname |
name of the topic, usually a function |
type |
type of the topic, such as |
Georgi N. Boshnakov
u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class=TRUE ) parse_Rdname(u1) u2 <- list_Rd(name = "dummyclass-class", alias = "Dummyclass", title = "Class dummyclass", description = "Objects and methods for something.", Rd_class=TRUE ) parse_Rdname(u2)
u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class=TRUE ) parse_Rdname(u1) u2 <- list_Rd(name = "dummyclass-class", alias = "Dummyclass", title = "Class dummyclass", description = "Objects and methods for something.", Rd_class=TRUE ) parse_Rdname(u2)
Parse a piece of Rd source text.
parse_Rdpiece(x, result = "")
parse_Rdpiece(x, result = "")
x |
the piece of Rd text, a character vector. |
result |
if "text", converts the result to printable text (e.g. to be shown to the user), otherwise returns an Rd object. |
parse_Rdpiece
parses a piece of source Rd text. The text may be
an almost arbitrary piece that may be inserted in an Rd source file,
except that it should not be a top level section (use
parse_Rdtext
for sections). Todo: it probably can be
also a parsed piece, check!
This is somewhat tricky since parse_Rd
does not accept
arbitrary piece of Rd text. It handles either a complete Rd source or
a fragment, defined (as I understand it) as a top level section. To
circumvent this limitation, this function constructs a minimal
complete Rd source putting argument x
in a section (currently
"Note") which does not have special formatting on its own. After
parsing, it extracts only the part corresponding to x
.
parse_Rdpiece
by default returns the parsed Rd piece. However,
if result="text"
, then the text is formatted as the help system
would do when presenting help pages in text format.
TODO: add an argument for macros?
a parsed Rd piece or its textual representation as described in Details
Georgi N. Boshnakov
# the following creates Rd object rdo dummyfun <- function(x) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "A. Author", Rd_class = TRUE ) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) # let's prepare a new item rd <- "\\item{...}{further arguments to be passed on.}" newarg <- parse_Rdtext(rd, section = "\\arguments") # now append 'newarg' to the arguments section of rdo iarg <- which(tools:::RdTags(rdo) == "\\arguments") rdoa <- append_to_Rd_list(rdo, newarg, iarg) Rdo_show(rdoa) # for arguments and other frequent tasks, there are specialised functions dots <- paste0("\\", "dots") rdob <- Rdo_append_argument(rdo, dots, "further arguments to be passed on.") Rdo_show(reprompt(rdob, filename = fn)) unlink(fn)
# the following creates Rd object rdo dummyfun <- function(x) x u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "A. Author", Rd_class = TRUE ) fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) # let's prepare a new item rd <- "\\item{...}{further arguments to be passed on.}" newarg <- parse_Rdtext(rd, section = "\\arguments") # now append 'newarg' to the arguments section of rdo iarg <- which(tools:::RdTags(rdo) == "\\arguments") rdoa <- append_to_Rd_list(rdo, newarg, iarg) Rdo_show(rdoa) # for arguments and other frequent tasks, there are specialised functions dots <- paste0("\\", "dots") rdob <- Rdo_append_argument(rdo, dots, "further arguments to be passed on.") Rdo_show(reprompt(rdob, filename = fn)) unlink(fn)
Parse Rd source text as the contents of a given section.
parse_Rdtext(text, section = NA)
parse_Rdtext(text, section = NA)
text |
Rd source text, a character vector. |
section |
the section name, a string. |
If section
is given, then parse_Rdtext
parses
text
as appropriate for the content of section section
.
This is achieved by inserting text
as an argument to the TeX
macro section
. For example, if section
is
"\usage
", then a line "\usage{
" is inserted at the
begiinning of text
and a closing "}
" at its end.
If section
is NA then parse_Rdtext
parses it without
preprocessing. In this case text
itself will normally be
a complete section fragment.
an Rd fragment
The text is saved to a temporary file and parsed using
parse_Rd
. This is done for at least two reasons. Firstly,
parse_Rd
works most reliably (at the time of writing this)
from a file. Secondly, the saved file may be slightly different
(escaped backslashes being the primary example).
It would be a nightmare to ensure that all concerned functions know
if some Rd text is read from a file or not.
The (currently internal) function .parse_Rdlines
takes a
character vector, writes it to a file (using cat
) and calls
parse_Rd
to parse it.
Georgi N. Boshnakov
Parse usage text.
parse_1usage_text(text) parse_usage_text(text)
parse_1usage_text(text) parse_usage_text(text)
text |
conceptually, the content of the usage section of one or more Rd objects, a character vector, see Details. |
For parse_usage_text
, text
is a character vector
representing the contents of the usage section of an Rdo object.
parse_usage_text
does some preprocessing of text
then
calls parse_1usage_text
for each usage statement.
The preprocessing changes "\
dots
" to "...
" and
converts S3- and S4-method descriptions to a form suitable for
parse()
. The text is then parsed (with parse
) and
"srcref
" attribute removed from the parsed object.
todo: currently no checks is made for Rd comments in text
.
parse_1usage_text
processes the usage statement of one object
and calls pairlist2f_usage1
to convert it to an object
from S3 class "f_usage"
.
for parse_1usage_text
, an object from S3 class
"f_usage"
, see pairlist2f_usage1
for its
structure.
for parse_usage_text
, a list containing one element for each
usage entry, as prepared by parse_1usage_text
Georgi N. Boshnakov
Tables of predefined sections and types of pieces of Rd objects.
Rdo_predefined_sections Rdo_piece_types rdo_top_tags
Rdo_predefined_sections Rdo_piece_types rdo_top_tags
The Rd syntax defines several tables (Murdoch 2010). Rdpack stores them in the variables described here.
Rdo_predefined_sections
is a named character vector providing
the types of the top level sections in an Rd object.
Rdo_piece_types
is a named character vector giving the types of
the core (all possible?) Rd macros.
NOTE: These objects are hard coded and need to be updated if the specifications of the Rd format are updated.
todo: write functions that go through existing Rd documentation to discover missing or wrong items.
for Rdo_predefined_sections
, the name-value pairs are given in
the following table. For example, Rdo_predefined_sections["examples"]
results
in RCODE.
name | VERB | | | description | TEXT |
alias | VERB | | | examples | RCODE |
concept | TEXT | | | usage | RCODE |
docType | TEXT | | | Rdversion | VERB |
title | TEXT | | | synopsis | VERB |
name | VERB | | | section | TEXT |
alias | VERB | | | arguments | TEXT |
concept | TEXT | | | keyword | TEXT |
docType | TEXT | | | note | TEXT |
title | TEXT | | | format | TEXT |
name | VERB | | | source | TEXT |
alias | VERB | | | details | TEXT |
concept | TEXT | | | value | TEXT |
docType | TEXT | | | references | TEXT |
title | TEXT | | | author | TEXT |
name | VERB | | | seealso | TEXT |
for Rdo_piece_types
, the name-value pairs are:
name | VERB | | alias | VERB | | concept | TEXT |
docType | TEXT | | title | TEXT | | description | TEXT |
examples | RCODE | | usage | RCODE | | Rdversion | VERB |
synopsis | VERB | | Sexpr | RCODE | | RdOpts | VERB |
code | RCODE | | dontshow | RCODE | | donttest | RCODE |
testonly | RCODE | | dontrun | VERB | | env | VERB |
kbd | VERB | | option | VERB | | out | VERB |
preformatted | VERB | | samp | VERB | | special | VERB |
url | VERB | | verb | VERB | | deqn | VERB |
eqn | VERB | | renewcommand | VERB | | newcommand | VERB |
for rdo_top_tags
, the values are:
\name | \Rdversion | \docType | \alias | \encoding |
\concept | \title | \description | \usage | \format |
\source | \arguments | \details | \value | \references |
\section | \note | \author | \seealso | \examples |
\keyword |
# ifdef |
# ifndef |
\newcommand | \renewcommand |
COMMENT | TEXT |
Note that most, but not all, are prefixed with a backslash.
Duncan Murdoch (2010). “Parsing Rd files.” https://developer.r-project.org/parseRd.pdf.
Generates a shell of documentation for an installed package. The content is similar to ‘promptPackage’ but information that can be computed is produced with Sexpr's so that it is always up to date.
promptPackageSexpr(package, filename = NULL, final = TRUE, overview = FALSE, bib = TRUE)
promptPackageSexpr(package, filename = NULL, final = TRUE, overview = FALSE, bib = TRUE)
package |
name of a package, a string |
filename |
name of a file where to write the generated Rd content, a string. The default should be sufficient in most cases. |
final |
logical; if |
overview |
logical; if |
bib |
If TRUE, create a comment line in the references section
that will cause |
The generated skeleton is functionally (almost) equivalent to that
produced by promptPackage
. The difference is that while
promptPackage
computes some information and inserts it verbatim
in the skeleton, promptPackageSexpr
inserts Sexpr's for the
computation of the same information at package build time.
In this way there is no need to manually update information like the version of the package. The index of functions (which contains their descriptions) does not need manual updating, as well.
promptPackageSexpr
needs to be called only once to create the
initial skeleton. Then the Rd file can be edited as needed.
If the Rd file is generated with the option bib = TRUE
(or the
appropriate lines are added to the refernces section manually) the
references can be updated at any time by a call of rebib
.
todo: At the moment final=FALSE
has the effect
described for overview
. At the time of writing this
(2011-11-18) I do not remember if this is intentional or the
corresponding ‘if’ clause contains |
by mistake.
the name of the file (invisibly)
The automatically generated information is that of the installed (or
at least built) package. Usually this is not a problem (and this is
the idea of the function) but it means that if a developer is adding
documentation for previously undocumented functions, they will appear
in the 'Index' section only after the package is installed
again. Similarly, if the description file of the package is changed,
the package needs to be installed again for the changes to appear in
the overview. Since the documentation is installed together with the
package this is no surprise, of course. This may only cause a problem
if documentation is produced with R CMD Rd2pdf
before the
updated version is installed.
This function is not called repromptXXX
since the idea is that
it is called only once and then the Rd file can be edited freely, see
also ‘Details’.
Georgi N. Boshnakov
Generates usage text for a function, S3 method or S4 method. The text is suitably formatted for inclusion in the usage section of Rd documentation.
get_usage(object, name = NULL, force.function = FALSE, ..., S3class = "", S4sig = "", infix = FALSE, fu = TRUE, out.format = "text") promptUsage(..., usage)
get_usage(object, name = NULL, force.function = FALSE, ..., S3class = "", S4sig = "", infix = FALSE, fu = TRUE, out.format = "text") promptUsage(..., usage)
object |
a function object or a character name of one, can be anonymous function. |
name |
the name of a function, a string. |
force.function |
enforce looking for a function. |
S3class |
the S3 class of the function, a character vector. |
out.format |
if " |
S4sig |
(the signature of an S4 method, as used in Rd macro
|
infix |
if TRUE the function is an infix operator. |
fu |
if TRUE the object is a function, otherwise it is something
else (e.g. a variable or a constant like |
usage |
an usage object, see Details. |
... |
for |
get_usage()
takes a function object, or the name of one, and
creates text suitable for inclusion in the usage section of Rd
documentation. The usage is generated from the function object. When
in interactive R session, use cat()
to print the result for
copying and pasting into Rd documentation or saving to a file
(otherwise, if the usage text contains backslashes, they may appear
duplicated). Long text is wrapped on two or more lines. For example,
cat(get_usage(lm)) ##: lm(formula, data, subset, weights, na.action, method = "qr", ##: model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, ##: contrasts = NULL, offset, \dots)
Argument "name"
can be used to specify a print name for the function.
This is most often needed for S3 methods. Compare
cat(get_usage(summary.lm)) ##: summary.lm(object, correlation = FALSE, symbolic.cor = FALSE, \dots)
and
cat(get_usage(summary.lm, name = "summary")) ##: summary(object, correlation = FALSE, symbolic.cor = FALSE, \dots)
The call is just summary()
in the latter. This fairly reflects
the fact that S3 methods are normally called via the generic, but
adding some explanatory text around the command is usually a good
idea. For programmatically generated usage sections in help pages,
argument S3class
can be used to get the standard Rd markup for
S3 methods.
cat(get_usage(summary.lm, "summary", S3class = "lm")) ##: \method{summary}{lm}(object, correlation = FALSE, symbolic.cor = FALSE, \dots)
(Note that \method
can only be used in Usage sections.)
When object
is an anonymous function, argument name
is compulsory.
For example,
cat( get_usage(function(x = 3, y = "a"){}, "f") )
get_usage()
can also be used to insert dynamically signatures
of functions located in other objects, such as environments and lists,
see the examples.
If a function is used as an infix operator, set infix = TRUE
.
get_usage("+", infix = TRUE) ##: [1] "e1 + e2" get_usage("%in%", infix = TRUE) ##: [1] "x %in% table"
The name of the operator may be in a variable:
op <- "+" get_usage(op, infix = TRUE) ##: [1] "e1 + e2"
Backticks are ok, as well,
get_usage(`+`, infix = TRUE) ##: [1] "e1 + e2"
But if a backticked operator is in a variable, surprise springs:
op <- `+` get_usage(op, infix = TRUE) ##: [1] "e1 op e2"
In this case, don't use backticks or, if you must, evaluate the argument:
op <- `+` get_usage(eval(op), name = "+", infix = TRUE) ##: [1] "e1 + e2"
promptUsage()
is mostly for internal use. It is like
get_usage()
with an additional argument, usage
, used to
pass a specially parsed argument list of class "f_usage"
,
produced by other functions in Rdpack. In particular it could
have been generated by a previous call to get_usage()
.
a character string or an object of S3 class "f_usage
",
see pairlist2f_usage1
for its format.
For an S3 or S4 generic, use the name of the function, not the object, see the examples.
These functions are for usage descriptions as they appear in the "usage" section of Rd files. Descriptions of S4 methods for "Methods" sections are dealt with by other functions.
Georgi N. Boshnakov
u <- get_usage(lm) # a long usage text cat(u) # if there are additional arguments in S3 methods, # use names of the functions, not the objects, e.g. get_usage("droplevels", S3class = "data.frame") get_usage(name = "droplevels", S3class = "data.frame") # (both give "\method{droplevels}{data.frame}(x, except = NULL, \dots)") # but this gives the args of the generic: "\method{droplevels}{data.frame}(x, \dots)" get_usage(droplevels, S3class = "data.frame") ## a list containing some functions summaries <- list(xbar = function(x) mean(x), rho = function(x, y) cor(x,y)) get_usage(summaries$xbar, name = "xbar") get_usage(summaries$rho, name = "rho") ## functions in an environment esummaries <- list2env(summaries) get_usage(esummaries$xbar, name = "xbar") get_usage(esummaries$rho, name = "rho")
u <- get_usage(lm) # a long usage text cat(u) # if there are additional arguments in S3 methods, # use names of the functions, not the objects, e.g. get_usage("droplevels", S3class = "data.frame") get_usage(name = "droplevels", S3class = "data.frame") # (both give "\method{droplevels}{data.frame}(x, except = NULL, \dots)") # but this gives the args of the generic: "\method{droplevels}{data.frame}(x, \dots)" get_usage(droplevels, S3class = "data.frame") ## a list containing some functions summaries <- list(xbar = function(x) mean(x), rho = function(x, y) cor(x,y)) get_usage(summaries$xbar, name = "xbar") get_usage(summaries$rho, name = "rho") ## functions in an environment esummaries <- list2env(summaries) get_usage(esummaries$xbar, name = "xbar") get_usage(esummaries$rho, name = "rho")
Manipulate a number of Rd files.
Rd_combo(rd, f, ..., .MORE)
Rd_combo(rd, f, ..., .MORE)
rd |
names of Rd files, a character vector. |
f |
function to apply, see Details. |
... |
further arguments to pass on to |
.MORE |
another function to be applied for each file to the
result of |
Rd_combo
parses each file in rd
, applies f
to the
Rd object, and applies the function .MORE
(if supplied) on the
results of f
.
A typical value for .MORE
is reprompt
or another
function that saves the resulting Rd object.
todo: Rd_combo
is already useful but needs further work.
## Not run: rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) ## which Rd files don't have a value section? counts <- unlist(Rd_combo(rdnames, function(x) length(Rdo_locate_core_section(x, "\value")))) rdnames[counts == 0] ## reprompt all files Rd_combo(rdnames, reprompt) for(nam in rdnames) try(reprompt(nam)) for(nam in rdnames) try(reprompt(nam, sec_copy=FALSE)) ## End(Not run)
## Not run: rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) ## which Rd files don't have a value section? counts <- unlist(Rd_combo(rdnames, function(x) length(Rdo_locate_core_section(x, "\value")))) rdnames[counts == 0] ## reprompt all files Rd_combo(rdnames, reprompt) for(nam in rdnames) try(reprompt(nam)) for(nam in rdnames) try(reprompt(nam, sec_copy=FALSE)) ## End(Not run)
Apply a function recursively over an Rd object, similarly to rapply but keeping attributes.
Rdapply(x, ...) Rdtagapply(object, FUN, rdtag, classes = "character", how = "replace", ...) rattr(x, y)
Rdapply(x, ...) Rdtagapply(object, FUN, rdtag, classes = "character", how = "replace", ...) rattr(x, y)
x |
the Rd object on which to apply a function. |
object |
the Rd object on which to apply a function. |
FUN |
The function to apply, see details |
rdtag |
apply FUN only to elements whose |
y |
an Rd object with the same structure as |
... |
arguments to pass to |
classes |
a character vector, passed on to |
how |
a character string, passed on to |
Rdapply
works like rapply
but preserves the attributes
of x
and (recursively) any sublists of it. Rdapply
first calls rapply
, passing all arguments to it. Then it
restores recursively the attributes by calling rattr
.
Note that the object returned by rapply
is assumed to have
identical structure to the original object. This means that argument
how
of rapply
must not be "unlist" and normally will be
"replace". Rdtagapply
gives sensible default values for
classes
and how
. See the documentation of
rapply
for details and the possible choices for
classes
, how
or other arguments passed to it via
"\dots"
.
Rdtagapply
is a convenience variant of Rdapply
for the
common task of modifying or examining only elements with a given
Rd_tag
attribute. Since the Rd equation macros \eqn
and
\deqn
are assigned Rd tag "VERB" but are processed differently
from other "VERB" pieces, pseudo-tags
"mathVERB" and "nonmathVERB" are provided, such that "mathVERB" is for
actions on the first argument of the mathematical macros \eqn
and
\deqn
, while "nonmathVERB" is for actions on "VERB" macros in
all other contexts. There is also a pseudo-tag "nonmath" for anything
that is not math.
rattr
is an auxilliary function which takes two Rd objects
(with identical structure) and recursively examines them. It makes the
attributes of any lists in the first argument identical to the
corresponding attributes in the second.
For Rdapply
and Rdtagapply
, an Rd object with some of
its leaves replaced as specified above.
For rattr
, the object x
with attributes of any list
elements of it set to the corresponding attributes of y
.
todo: may be it is better to rename the argument FUN of Rdtagapply
to
f
, which is its name in rapply
.
Georgi N. Boshnakov
# create an Rd object for the sake of example u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", examples = "\na <- matrix(1:6,nrow=2)\na %*% t(a)\nt(a) %*% a", Rd_class=TRUE ) # correct R code for examples but wrong for saving in Rd files Rdo_show(u1) # escape percents everywhere except in comments # (actually, .anypercent escapes only unescaped percents) rdo <- Rdapply(u1, Rdpack:::.anypercent, classes = "character", how = "replace") # syntactically wrong R code for examples but ok for saving in Rd files Rdo_show(rdo) # Rdo2Rdf does this by default for examples and other R code, # so code can be kept syntactically correct while processing. # (reprompt() takes care of this too as it uses Rdo2Rdf for saving) fn <- tempfile("u1", fileext="Rd") Rdo2Rdf(u1, file = fn) # the saved file contains escaped percents but they disappear in parsing: file.show(fn) Rdo_show(tools::parse_Rd(fn)) # if you think that sections should start on new lines, # the following makes the file a little more human-friendly # (by inserting new lines). u2 <- Rdpack:::.Rd_tidy(u1) Rdo2Rdf(u2, file = fn) file.show(fn) unlink(fn)
# create an Rd object for the sake of example u1 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x)", value = "numeric vector", author = "A. Author", examples = "\na <- matrix(1:6,nrow=2)\na %*% t(a)\nt(a) %*% a", Rd_class=TRUE ) # correct R code for examples but wrong for saving in Rd files Rdo_show(u1) # escape percents everywhere except in comments # (actually, .anypercent escapes only unescaped percents) rdo <- Rdapply(u1, Rdpack:::.anypercent, classes = "character", how = "replace") # syntactically wrong R code for examples but ok for saving in Rd files Rdo_show(rdo) # Rdo2Rdf does this by default for examples and other R code, # so code can be kept syntactically correct while processing. # (reprompt() takes care of this too as it uses Rdo2Rdf for saving) fn <- tempfile("u1", fileext="Rd") Rdo2Rdf(u1, file = fn) # the saved file contains escaped percents but they disappear in parsing: file.show(fn) Rdo_show(tools::parse_Rd(fn)) # if you think that sections should start on new lines, # the following makes the file a little more human-friendly # (by inserting new lines). u2 <- Rdpack:::.Rd_tidy(u1) Rdo2Rdf(u2, file = fn) file.show(fn) unlink(fn)
Append an item for a new argument to an Rd object.
Rdo_append_argument(rdo, argname, description = NA, indent = " ", create = FALSE)
Rdo_append_argument(rdo, argname, description = NA, indent = " ", create = FALSE)
rdo |
an Rd object. |
argname |
name of the argument, a character vector. |
description |
description of the argument, a character vector. |
indent |
a string, typically whitespace. |
create |
not used (todo: remove?) |
Appends one or more items to the section describing arguments of functions in an Rd object. The section is created if not present.
If description
is missing or NA, a "todo" text is inserted.
The inserted text is indented using the string indent
.
The lengths of argname
and description
should normally
be equal but if description
is of length one, it is repeated to
achieve this when needed.
an Rd object
Georgi N. Boshnakov
## the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = ".Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) ## add documentation for arguments ## that are not in the signature of 'dummyfun()' dottext <- "further arguments to be passed on." dots <- paste0("\\", "dots") rdo2 <- Rdo_append_argument(rdo, dots, dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") ## reprompt() warns to remove documentation for non-existing arguments: Rdo_show(reprompt(rdo2, filename = fn)) unlink(fn)
## the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = ".Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) ## add documentation for arguments ## that are not in the signature of 'dummyfun()' dottext <- "further arguments to be passed on." dots <- paste0("\\", "dots") rdo2 <- Rdo_append_argument(rdo, dots, dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") ## reprompt() warns to remove documentation for non-existing arguments: Rdo_show(reprompt(rdo2, filename = fn)) unlink(fn)
Collect aliases or other metadata from an Rd object.
Rdo_collect_aliases(rdo) Rdo_collect_metadata(rdo, sec)
Rdo_collect_aliases(rdo) Rdo_collect_metadata(rdo, sec)
rdo |
an Rd object |
sec |
the kind of metadata to collect, a character string, such as "alias" and "keyword". |
Rdo_collect_aliases
finds all aliases in rdo
and returns
them as a named character vector. The name of an alias is usually the
empty string, ""
, but it may also be "windows" or "unix" if
the alias is wrapped in a #ifdef
directive with the
corresponding first argument.
Rdo_collect_metadata
is a generalisation of the above. It
collects the metadata from section(s) sec
, where sec
is
the name of a section without the leading backslash.
sec
is assumed to be a section containing a single word, such
as "keyword", "alias", "name".
Currently Rdo_collect_metadata
is not exported.
a named character vector, as described in Details.
Georgi N. Boshnakov
tools:::.Rd_get_metadata
## this example originally (circa 2012) was: ## infile <- file.path(R.home(), "src/library/base/man/timezones.Rd") ## but the OS conditional alias in that file has been removed. ## So, create an artificial example: infile <- system.file("examples", "tz.Rd", package = "Rdpack") ## file.show(infile) rd <- tools::parse_Rd(infile) ## The functions described here handle "ifdef" and similar directives. ## This detects OS specific aliases (windows = "onlywin" and unix = "onlyunix"): Rdo_collect_aliases(rd) Rdpack:::Rdo_collect_metadata(rd, "alias") # same ## In contrast, the following do not find "onlywin" and "onlyunix": sapply(rd[which(tools:::RdTags(rd)=="\alias")], as.character) tools:::.Rd_get_metadata(rd, "alias") Rdpack:::Rdo_collect_metadata(rd, "name") Rdpack:::Rdo_collect_metadata(rd, "keyword")
## this example originally (circa 2012) was: ## infile <- file.path(R.home(), "src/library/base/man/timezones.Rd") ## but the OS conditional alias in that file has been removed. ## So, create an artificial example: infile <- system.file("examples", "tz.Rd", package = "Rdpack") ## file.show(infile) rd <- tools::parse_Rd(infile) ## The functions described here handle "ifdef" and similar directives. ## This detects OS specific aliases (windows = "onlywin" and unix = "onlyunix"): Rdo_collect_aliases(rd) Rdpack:::Rdo_collect_metadata(rd, "alias") # same ## In contrast, the following do not find "onlywin" and "onlyunix": sapply(rd[which(tools:::RdTags(rd)=="\alias")], as.character) tools:::.Rd_get_metadata(rd, "alias") Rdpack:::Rdo_collect_metadata(rd, "name") Rdpack:::Rdo_collect_metadata(rd, "keyword")
Find or remove empty sections in Rd objects
Rdo_empty_sections(rdo, with_bs = FALSE) Rdo_drop_empty(rdo, sec = TRUE)
Rdo_empty_sections(rdo, with_bs = FALSE) Rdo_drop_empty(rdo, sec = TRUE)
rdo |
an Rd object or Rd source text. |
with_bs |
if |
sec |
not used |
The function checkRd
is used to determine which sections are
empty.
For Rdo_empty_sections
, the names of the empty sections as a
character vector.
For Rdo_drop_empty
, the Rd object stripped from empty
sections.
Georgi N. Boshnakov
dummyfun <- function(x) x rdo8 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "", details = "", note = "", Rd_class=TRUE ) Rdo_empty_sections(rdo8) # "details" "note" "author" rdo8a <- Rdo_drop_empty(rdo8) Rdo_empty_sections(rdo8a) # character(0)
dummyfun <- function(x) x rdo8 <- list_Rd(name = "Dummyname", alias = "dummyfun", title = "Dummy title", description = "Dummy description", usage = "dummyfun(x,y)", value = "numeric vector", author = "", details = "", note = "", Rd_class=TRUE ) Rdo_empty_sections(rdo8) # "details" "note" "author" rdo8a <- Rdo_drop_empty(rdo8) Rdo_empty_sections(rdo8a) # character(0)
Get a help page as an Rd object from an installed or source package.
Rdo_fetch(Rd_name = character(0), package, dir = ".", installed = TRUE)
Rdo_fetch(Rd_name = character(0), package, dir = ".", installed = TRUE)
Rd_name |
names of one or more Rd help pages. |
package |
the package from which to get the Rd object, a character string. |
dir |
a character string giving the root directory of a source package.
Used only if |
installed |
if |
If Rd_name
is a character string (typical use case), the
corresponding help page is returned as an object from class
"Rd"
. If the length of Rd_name
is greater than one, the
result is a Rd_named list containing the corresponding "Rd"
objects. The default Rd_name = character(0)
requests all Rd
pages in the package.
Note that Rd_name
does not contain the extention ".Rd"
but the names in the returned list do.
Argument package
names the package from which to fetch the
documentation object. With the default installed = TRUE
the
object is taken unconditionally from the installed package. To get it
from the source tree of a package, use argument "dir"
instead.
The default, ""
, for dir
is suitable for workflows where
the working directory is the root of the desired package.
Argument installed
concerns primarily development under package
"devtools"
. "devtools"
intercepts and modifies several
base R commands, concerning access to system files and getting help,
with the aim of rerouting them to the source trees of packages under
developer's mode. If argument installed
is TRUE
, the
default, the requested pages are taken from the installed package,
even if it is in development mode. If argument installed
is
FALSE
, the Rd objects are taken from the corresponding source
tree, if the specified package is under developer's mode, and from the
installed package otherwise.
Argument Rd_name
is the name used in the \name
section
of Rd files.
When working off the source tree of a package, Rdo_fetch
processes the Rd files, so roxygen2
users need to update
them if necessary.
if length(Rd_name) = 1
, an object of class "Rd"
,
otherwise a list of "Rd"
objects.
Georgi N. Boshnakov
## get a single help page rdo <- Rdo_fetch("viewRd", package = "Rdpack") Rdo_show(rdo) ## get a list of help pages rdo <- Rdo_fetch(c("viewRd", "reprompt"), package = "Rdpack") names(rdo)
## get a single help page rdo <- Rdo_fetch("viewRd", package = "Rdpack") Rdo_show(rdo) ## get a list of help pages rdo <- Rdo_fetch(c("viewRd", "reprompt"), package = "Rdpack") names(rdo)
Insert or remove content in an Rd fragment.
Rdo_flatinsert(rdo, val, pos, before = TRUE) Rdo_flatremove(rdo, from, to)
Rdo_flatinsert(rdo, val, pos, before = TRUE) Rdo_flatremove(rdo, from, to)
rdo |
an Rd object. |
val |
the value to insert. |
pos |
position. |
before |
if TRUE, insert the new content at pos, pushing the element at pos forward. |
from |
beginning of the region to remove. |
to |
end of the region to remove. |
Rdo_flatinsert
inserts val
at position pos
,
effectively by concatenation.
Rdo_flatremove
removes elements from from
to to
.
the modified rdo
Georgi N. Boshnakov
Get the names of arguments in usage sections of Rd objects.
Rdo_get_argument_names(rdo)
Rdo_get_argument_names(rdo)
rdo |
an Rdo object. |
All arguments names in the "arguments" section of rdo
are
extracted. If there is no such section, the results is a character
vector of length zero.
Arguments which have different descriptions for different OS'es are included and not duplicated.
Arguments which have descriptions for a particular OS are included, irrespectively of the OS of the running R process. (todo: introduce argument to control this?)
a character vector
Georgi N. Boshnakov
##---- Should be DIRECTLY executable !! ----
##---- Should be DIRECTLY executable !! ----
Find the position of an "Rd_tag".
Rdo_get_insert_pos(rdo, tag)
Rdo_get_insert_pos(rdo, tag)
rdo |
an Rd object |
tag |
the "Rd_tag" to search for, a string |
This function returns a position in rdo
, where the next element
carrying "Rd_tag" tag
should be inserted. The position is
determined as follows.
If one or more elements of rdo
have "Rd_tag" tag
, then
the position is one plus the position of the last such element.
If there are no elements with "Rd_tag" tag
, the position is one
plus the length of rdo
, unless tag
is a known top level
Rd section. In that case, the position is such that the standard
ordering of sections in an Rd object is followed. This is set in the
internal variable .rd_sections
.
an integer
Georgi N. Boshnakov
#h <- help("Rdo_macro") #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") ialias <- which(tools:::RdTags(rdo) == "\\alias") ialias next_pos <- Rdo_get_insert_pos(rdo, "\\alias") # 1 + max(ialias) next_pos stopifnot(next_pos == max(ialias) + 1) ikeyword <- which(tools:::RdTags(rdo) == "\\keyword") ikeyword next_pos <- Rdo_get_insert_pos(rdo, "\\keyword") # 1 + max(ikeyword) next_pos stopifnot(next_pos == max(ikeyword) + 1)
#h <- help("Rdo_macro") #rdo <- utils:::.getHelpFile(h) rdo <- Rdo_fetch("Rdo_macro", "Rdpack") ialias <- which(tools:::RdTags(rdo) == "\\alias") ialias next_pos <- Rdo_get_insert_pos(rdo, "\\alias") # 1 + max(ialias) next_pos stopifnot(next_pos == max(ialias) + 1) ikeyword <- which(tools:::RdTags(rdo) == "\\keyword") ikeyword next_pos <- Rdo_get_insert_pos(rdo, "\\keyword") # 1 + max(ikeyword) next_pos stopifnot(next_pos == max(ikeyword) + 1)
Get the labels of items in an Rd object.
Rdo_get_item_labels(rdo)
Rdo_get_item_labels(rdo)
rdo |
an Rd object. |
Rdo_get_item_labels(rdo)
gives the labels of all
"\item"
s in rdo
. Argument rdo
is often a section
or other Rd object fragment, see the examples.
a character vector
Georgi N. Boshnakov
infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## get item labels found anywhere in the Rd object (items <- Rdo_get_item_labels(rd)) ## search only in section "arguments" (i.e., get argument names) ## (note [[1]] - there is only one arguments section) pos.args <- Rdo_locate_core_section(rd, "\\arguments")[[1]] (args <- Rdo_get_item_labels(rd[[pos.args$pos]])) ## search only in section "value" pos.val <- Rdo_locate_core_section(rd, "\\value")[[1]] (vals <- Rdo_get_item_labels(rd[[pos.val$pos]])) ## There are no other items in 'rd', so this gives TRUE: all.equal(items, c(args, vals)) # TRUE
infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## get item labels found anywhere in the Rd object (items <- Rdo_get_item_labels(rd)) ## search only in section "arguments" (i.e., get argument names) ## (note [[1]] - there is only one arguments section) pos.args <- Rdo_locate_core_section(rd, "\\arguments")[[1]] (args <- Rdo_get_item_labels(rd[[pos.args$pos]])) ## search only in section "value" pos.val <- Rdo_locate_core_section(rd, "\\value")[[1]] (vals <- Rdo_get_item_labels(rd[[pos.val$pos]])) ## There are no other items in 'rd', so this gives TRUE: all.equal(items, c(args, vals)) # TRUE
Insert a new element in an Rd object possibly surrounding it with new lines.
Rdo_insert(rdo, val, newline = TRUE)
Rdo_insert(rdo, val, newline = TRUE)
rdo |
an Rd object |
val |
the content to insert, an Rd object. |
newline |
a logical value, controls the insertion of new lines
before and after |
Argument val
is inserted in rdo
at an appropriate
position, see Rdo_get_insert_pos
for detailed
explanation.
If newline
is TRUE, newline elements are inserted before and
after val
but only if they are not already there.
Typically, val
is a section of an Rd object and rdo
is
an Rd object which is being constructed or modified.
an Rd object
Georgi N. Boshnakov
Insert a new element at a given position in an Rd object.
Rdo_insert_element(rdo, val, pos)
Rdo_insert_element(rdo, val, pos)
rdo |
an Rd object |
val |
the content to insert. |
pos |
position at which to insert |
val
is inserted at position pos
, between the elements at
positions pos-1
and pos
. If pos
is equal to 1,
val
is prepended to rdo
. If pos
is missing or
equal to the length of rdo
, val
is appended to
rdo
.
todo: allow vector pos
to insert deeper into the object.
todo: character pos
to insert at a position specified by "tag" for example?
todo: more guarded copying of attributes?
an Rd object
Georgi N. Boshnakov
Check if an Rd fragment represents a newline character
Rdo_is_newline(rdo)
Rdo_is_newline(rdo)
rdo |
an Rd object |
This is a utility function that may be used to tidy up Rd objects.
It returns TRUE if the Rd object represents a newline
character, i.e. it is a character vector of length one containing the
string "\n"
. Attributes are ignored.
Otherwise it returns FALSE.
TRUE or FALSE
Georgi N. Boshnakov
Find positions of elements for which a function returns TRUE. Optionally, apply another function to the selected elements and return the results along with the positions.
Rdo_locate(object, f = function(x) TRUE, pos_only = TRUE, lists = FALSE, fpos = NULL, nested = TRUE)
Rdo_locate(object, f = function(x) TRUE, pos_only = TRUE, lists = FALSE, fpos = NULL, nested = TRUE)
object |
an Rd object |
f |
a function returning TRUE if an element is desired and FALSE otherwise. |
pos_only |
if TRUE, return only the positions; if this argument is a function, return also the result of applying the function to the selected element, see Details. |
lists |
if FALSE, examine only leaves, if TRUE, examine also lists, see Details. |
fpos |
a function with two arguments, |
nested |
a logical value, it has effect only when |
With the default setting of lists = FALSE
, the function
f
is applied to each leave (a character string) of the Rd
object. If lists = TRUE
the function f
is applied also
to each branch (a list). In this case, argument nested
controls
what happens when f
returns TRUE. If nested
is TRUE,
each element of the list is also inspected recursively, otherwise this
is not done and, effectively, the list is considered a leaf. If
f
does not return TRUE, the value of nested
has no
effect and the elements of the list are inspected.
The position of each object for which f
returns TRUE is
recorded as a numeric vector.
fpos
and pos_only
provide two ways to do something with
the selected elements. Argument fpos
is more powerful than
pos_only
but the latter should be sufficient and simpler to use
in most cases.
If fpos
is a function, it is applied to each selected element
with two arguments, object
and the position, and the result
returned along with the position. In this case argument
pos_only
is ignored. If fpos
is NULL the action depends
on pos_only
.
If pos_only = TRUE
, Rdo_locate
returns a list of such
vectors (not a matrix since the positions of the leaves are, in
general, at different depths).
If pos_only
is a function, it is applied to each selected
element and the result returned along with the position.
a list with one entry for each selected element. Each entry is a numeric vector or a list with two elements:
pos |
the position, a vector of positive integers, |
value |
the result of applying the function to the element at
|
The following needs additional thought.
In some circumstances an empty list, tagged with Rd_tag
may
turn up, e.g. list()
with Rd_tag="\dots"
in an
\arguments
section.
On the one hand this is a list. On the other hand it may be considered a leaf. It is not clear if any attempt to recurse into such a list should be made at all.
Georgi N. Boshnakov
Rdo_sections
and
Rdo_locate_core_section
which locate top level sections
# todo: put examples here!
# todo: put examples here!
Apply a function to the character leaves of an Rd object and return the indices of those for which the result is TRUE.
Rdo_locate_leaves(object, f = function(x) TRUE)
Rdo_locate_leaves(object, f = function(x) TRUE)
object |
the object to be examined, usually a list. |
f |
a function (predicate) returning TRUE for elements with the desired property. |
object
can be any list whose elements are character strings or
lists. The structure is examined recursively. If object
is a
character vector, it is enclosed in a list.
This function provides a convenient way to locate leaves of an Rd
object with a particular content. The function is not limited to Rd
objects but it assumes that the elements of object
are either
lists or charater vectors and currently does not check if this is the
case.
todo: describe the case of list()
(Rd_tag
'ed.)
a list of the positions of the leaves for which the predicate gives
TRUE
. Each position is an integer vector suitable for the
"[["
operator.
Georgi N. Boshnakov
dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) f <- function(x) Rdo_is_newline(x) nl <- Rdo_locate_leaves(rdo, f ) length(nl) # there are quite a few newline leaves! unlink(fn)
dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) f <- function(x) Rdo_is_newline(x) nl <- Rdo_locate_leaves(rdo, f ) length(nl) # there are quite a few newline leaves! unlink(fn)
Format Rd fragments as macros, generally by putting them in a list and setting the "Rd_tag" as needed.
Rdo_macro(x, name) Rdo_macro1(x, name) Rdo_macro2(x, y, name) Rdo_item(x, y) Rdo_sigitem(x, y, newline = TRUE)
Rdo_macro(x, name) Rdo_macro1(x, name) Rdo_macro2(x, y, name) Rdo_item(x, y) Rdo_sigitem(x, y, newline = TRUE)
x |
an object. |
y |
an object. |
name |
the " |
newline |
currently ignored. |
Rdo_macro1
wraps x
in a list with "Rd_tag
"
name
. This is the representation of Rd macros with one argument.
Rdo_macro2
basically wraps a possibly transformed x
and
y
in a list with "Rd_tag
" name
. More specifically,
if x
has a non-NULL "Rd_tag
", x
is wrapped in
list
. Otherwise x
is left as is, unless x
is a
character string, when it is converted to a text Rd element and
wrapped in list
. y
is processed in the same way.
This is the representation of Rd macros with two arguments.
Rdo_macro
returns an object with "Rd_tag
" name
,
constructed as follows. If x
is not of class "character", its
attribute "Rd_tag
" is set to name
and the result
returned without further processing. Otherwise, if it is of class
"character", x
is tagged as an Rd "TEXT" element. It is then
wrapped in a list but only if name
is one of "\eqn
" or
"\deqn
". Finally, Rdo_macro1
is called on the
transformed object.
Rdo_item
is equivalent to Rdo_macro2
with name
set to "\item
".
Rdo_sigitem
is for items which have the syntax used in
description of signatures. In that case the first argument of
"\item
" is wrapped in "\code
". If y
is missing,
a text inviting the author to provide a description of the function
for this signature is inserted.
An Rd element with appropriately set Rd_tag
, as described in
‘Details’.
Georgi N. Boshnakov
Replace or modify parts of Rd objects.
Rdo_modify(rdo, val, create = FALSE, replace = FALSE, top = TRUE) Rdo_replace_section(rdo, val, create = FALSE, replace = TRUE)
Rdo_modify(rdo, val, create = FALSE, replace = FALSE, top = TRUE) Rdo_replace_section(rdo, val, create = FALSE, replace = TRUE)
rdo |
an Rd object. |
val |
an Rd fragment. |
create |
if TRUE, create a new section, see ‘Details’. |
replace |
a logical, if TRUE |
top |
a logical, if TRUE examine also the "Rd_tag" of |
Argument rdo
is an Rd object (complete or a fragment) to be
modified. val
is an Rd fragment to use for modification.
Basically, val
is appended to (if replace
is FALSE) or
replaces (if replace
is TRUE) the content of an element of
rdo
which has the same "Rd_tag" as val
.
Argument top
specifies whether to check the "Rd_tag" of
rdo
itself, see below.
Here are the details.
If top
is TRUE and rdo
and val
have the same
(non-NULL) "Rd_tag", then the action depends on replace
(argument create
is ignored in this case).
If replace
is TRUE, val
is returned. Otherwise
rdo
and val
are, effectively, concatenated. For example,
rdo
may be the "arguments" section of an Rd object and
val
may also be an "arguments" section containing new
arguments.
Otherwise, an element with the "Rd_tag" of val
is searched in
rdo
using tools:::RdTags()
. If such elements are found,
the action again depends on replace
.
If replace
is a character string, then the first element of
rdo
that is a list whose only element is identical to the
value of replace
is replaced by val
. If such an
element is not present and create
is TRUE, val
is
inserted in rdo
. If create
is FALSE, rdo
is not
changed.
If replace
is TRUE, the first element found is replaced with
val
.
If replace
is FALSE, val
is appended to the first
element found.
If no element with the "Rd_tag" of val
is found the action
depends on create
. If create
is TRUE, then val
is inserted in rdo
, effectively creating a new section. If
create
is FALSE, an error is thrown.
Rdo_replace_section
is like Rdo_modify
with argument
top
fixed to TRUE and the default for argument replace
set to TRUE. It hardly makes sense to call Rdo_replace_section
with replace = FALSE
but a character value for it may be
handy in some cases, see the examples.
an Rd object or fragment, as described in ‘Details’
Georgi N. Boshnakov
# a <- tools::parse_Rd("./man/promptUsage.Rd") # char2Rdpiece("documentation", "keyword") # this changes a keyword from Rd to documentation # Rdo_replace_section(a, char2Rdpiece("documentation", "keyword"), replace = "Rd")
# a <- tools::parse_Rd("./man/promptUsage.Rd") # char2Rdpiece("documentation", "keyword") # this changes a keyword from Rd to documentation # Rdo_replace_section(a, char2Rdpiece("documentation", "keyword"), replace = "Rd")
Simple modification of Rd objects.
Rdo_modify_simple(rdo, text, section, ...)
Rdo_modify_simple(rdo, text, section, ...)
rdo |
an Rd object. |
text |
a character vector |
section |
name of an Rd section, a string. |
... |
additional arguments to be passed to |
Argument text
is used to modify (as a replacement of or
addition to) the content of section section
of rdo
.
This function can be used for simple modifications of an Rd object using character content without converting it separately to Rd.
text
is converted to Rd with char2Rdpiece(text, section)
.
The result is passed to Rdo_modify
, together with
the remaining arguments.
an Rd object
Georgi N. Boshnakov
Give information about Rd elements.
Rdo_piecetag(name) Rdo_sectype(x) is_Rdsecname(name)
Rdo_piecetag(name) Rdo_sectype(x) is_Rdsecname(name)
name |
the name of an Rd macro, a string. |
x |
the name of an Rd macro, a string. |
Rdo_piecetag
gives the "Rd_tag" of the Rd macro name
.
Rdo_sectype
gives the "Rd_tag" of the Rd section x
.
is_Rdsecname(name)
returns TRUE if name
is the name of a
top level Rd section.
The information returned by these functions is obtained from the
charater vectors Rdo_piece_types
and
Rdo_predefined_sections
.
Georgi N. Boshnakov
Rdo_piece_types
and
Rdo_predefined_sections
Rdo_piecetag("eqn") # ==> "VERB" Rdo_piecetag("code") # ==> "RCODE" Rdo_sectype("usage") # ==> "RCODE" Rdo_sectype("title") # ==> "TEXT" Rdo_sectype("arguments")
Rdo_piecetag("eqn") # ==> "VERB" Rdo_piecetag("code") # ==> "RCODE" Rdo_sectype("usage") # ==> "RCODE" Rdo_sectype("title") # ==> "TEXT" Rdo_sectype("arguments")
Removes srcref attributes from Rd objects.
Rdo_remove_srcref(rdo)
Rdo_remove_srcref(rdo)
rdo |
an Rd object |
srcref
attrbutes (set by parse_Rd
) may be getting in the
way during manipulation of Rd objects, such as comparisons, addition
and replacement of elements. This function traverses the
argument and removes the srcref
attribute from all of its elements.
an Rd object with no srcref attributes.
Georgi N. Boshnakov
Reparse an Rd object.
Rdo_reparse(rdo)
Rdo_reparse(rdo)
rdo |
an Rd object |
Rdo_reparse
saves rdo
to a temporary file and parses it
with parse_Rd
. This ensures that the Rd object is a "canonical"
one, since one and the same Rd file can be produced by different (but
equivalent) Rd objects.
Also, the functions in this package do not attend to attribute "srcref" (and do not use it) and reparsing takes care of this. (todo: check if there is a problem if the tempfile disappears.)
(Murdoch 2010; Francois 2014)
Romain Francois (2014).
bibtex: bibtex parser.
R package version 0.4.0.
Duncan Murdoch (2010).
“Parsing Rd files.”
https://developer.r-project.org/parseRd.pdf.
# the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) dottext <- "further arguments to be passed on." dots <- paste0("\\", "dots") rdo2 <- Rdo_append_argument(rdo, dots, dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") Rdo_show(Rdo_reparse(rdo2)) # the following does ot show the arguments. (todo: why?) # (see also examples in Rdo_append_argument) Rdo_show(rdo2) unlink(fn)
# the following creates Rd object rdo dummyfun <- function(x) x fn <- tempfile("dummyfun", fileext = "Rd") reprompt(dummyfun, filename = fn) rdo <- tools::parse_Rd(fn) dottext <- "further arguments to be passed on." dots <- paste0("\\", "dots") rdo2 <- Rdo_append_argument(rdo, dots, dottext, create = TRUE) rdo2 <- Rdo_append_argument(rdo2, "z", "a numeric vector") Rdo_show(Rdo_reparse(rdo2)) # the following does ot show the arguments. (todo: why?) # (see also examples in Rdo_append_argument) Rdo_show(rdo2) unlink(fn)
Locate the Rd sections in an Rd object and return a list of their positions and names.
Rdo_sections(rdo) Rdo_locate_core_section(rdo, sec)
Rdo_sections(rdo) Rdo_locate_core_section(rdo, sec)
rdo |
an Rd object. |
sec |
the name of a section, a character string. For builtin sections the leading backslash should be included. |
Rdo_sections
locates all sections at the top level in an Rd
object. This includes the predefined sections and the user defined
sections. Sections wrapped in #ifdef
directives are also found.
Rdo_sections
returns a list with one entry for each section in
rdo
. This entry is a list with components "pos"
and
"title"
giving the position (suitable for use in "[["
)
and the title of the section. For user defined sections the actual
name is returned, not "section".
The names of the sections are returned as single strings without attributes. The titles of predefined sections are single words but user defined sections may have longer titles and sometimes contain basic markup.
Rdo_locate_core_section
works similarly but returns only the
results for section sec
. Currently it simply calls
Rdo_sections
and returns only the results for sec
.
Note that for consistency Rdo_locate_core_section
does not
attempt to simplify the result in the common case when there is only
one instance of the requested section—it is put in a list of length
one.
(Murdoch 2010) (Francois 2014)
A list giving the positions and titles of the sections in rdo
as described in 'Details'. The format is essentially that of
Rdo_locate
, the difference being that field "value"
from that function is renamed to "title" here.
pos |
the position, a vector of positive integers, |
title |
a standard section name, such as |
I wrote Rdo_sections
and Rdo_locate_core_section
after
most of the core functionality was tested. Currently these functions
are underused—they can replace a number of internal and exported
functions.
Georgi N. Boshnakov
Romain Francois (2014).
bibtex: bibtex parser.
R package version 0.4.0.
Duncan Murdoch (2010).
“Parsing Rd files.”
https://developer.r-project.org/parseRd.pdf.
infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## Locate all top level sections in rd sections <- Rdo_sections(rd) ## How many sections there are in rd? length(sections) ## What are their titles? sapply(sections, function(x) x$title) ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\title") ## Locate a user defined secion Rdo_locate_core_section(rd, "Further information") ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\details") ## All appearances of the requested section are returned Rdo_locate_core_section(rd, "\\alias") Rdo_locate_core_section(rd, "\\keyword")
infile <- system.file("examples", "tz.Rd", package = "Rdpack") rd <- tools::parse_Rd(infile) ## Locate all top level sections in rd sections <- Rdo_sections(rd) ## How many sections there are in rd? length(sections) ## What are their titles? sapply(sections, function(x) x$title) ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\title") ## Locate a user defined secion Rdo_locate_core_section(rd, "Further information") ## The names of builtin sections include the backslash Rdo_locate_core_section(rd, "\\details") ## All appearances of the requested section are returned Rdo_locate_core_section(rd, "\\alias") Rdo_locate_core_section(rd, "\\keyword")
Replace a section in an Rd file.
Rdo_set_section(text, sec, file, ...)
Rdo_set_section(text, sec, file, ...)
text |
the new text of the section, a character vector. |
sec |
name of the section. |
file |
name of the file. |
... |
arguments to be passed on to |
Parses the file, replaces the specified section with the new content
and writes the file back. The text is processed as appropriate for the
particular section (sec
).
For example:
Rdo_set_section("Georgi N. Boshnakov", "author", "./man/Rdo2Rdf.Rd")
(Some care is needed with the author field for "xxx-package.Rd" files, such
as "Rdpack-package.Rd", where the Author(s)
field has
somewhat different layout.)
By default Rdo_set_section
does not create the section if it
does not exist, since this may not be desirable for some Rd files. The
"..." arguments can be used to change this, they are passed on to
Rdo_modify
, see its documentation for details.
This function is used mainly for the side effect of changing file
.
It returns the Rd formatted text as a character vector.
Georgi N. Boshnakov
fnA <- tempfile("dummyfun", fileext = "Rd") dummyfun <- function(x) x reprompt(dummyfun, filename = fnA) Rdo_show(tools::parse_Rd(fnA)) ## set the author section, create it if necessary. Rdo_set_section("A.A. Author", "author", fnA, create = TRUE) Rdo_show(tools::parse_Rd(fnA)) ## replace the author section Rdo_set_section("Georgi N. Boshnakov", "author", fnA) Rdo_show(tools::parse_Rd(fnA)) unlink(fnA)
fnA <- tempfile("dummyfun", fileext = "Rd") dummyfun <- function(x) x reprompt(dummyfun, filename = fnA) Rdo_show(tools::parse_Rd(fnA)) ## set the author section, create it if necessary. Rdo_set_section("A.A. Author", "author", fnA, create = TRUE) Rdo_show(tools::parse_Rd(fnA)) ## replace the author section Rdo_set_section("Georgi N. Boshnakov", "author", fnA) Rdo_show(tools::parse_Rd(fnA)) unlink(fnA)
Render an Rd object as text and show it.
Rdo_show(rdo)
Rdo_show(rdo)
rdo |
an Rd object |
Rdo_show
renders the help page represented by rdo
as
text and shows it with file.show()
.
Rdo_show
is a simplified front end to utils::Rd2txt
.
See viewRd
for more complete rendering, including of
references and citations.
Invisible NULL
.
The function is used for the side effect of showing the text
representation of rdo
.
Georgi N. Boshnakov
## create a minimal Rd object u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) ## Not run: ## run this interactively: Rdo_show(u1) ## End(Not run)
## create a minimal Rd object u1 <- list_Rd(name = "Dummyname", alias = "Dummyallias1", title = "Dummy title", description = "Dummy description", Rd_class = TRUE ) ## Not run: ## run this interactively: Rdo_show(u1) ## End(Not run)
Set the Rd_tag of an object.
Rdo_comment(x = "%%") Rdo_tag(x, name) Rdo_verb(x) Rdo_Rcode(x) Rdo_text(x) Rdo_newline()
Rdo_comment(x = "%%") Rdo_tag(x, name) Rdo_verb(x) Rdo_Rcode(x) Rdo_text(x) Rdo_newline()
x |
an object, appropriate for the requested Rd_tag. |
name |
the tag name, a string. |
These functions simply set attribute "Rd_tag
" of x
, effectively
assuming that the caller has prepared it as needed.
Rdo_tag
sets the "Rd_tag
" attribute of x
to name
.
The other functions are shorthands with a fixed name and no second
argument.
Rdo_comment
tags an Rd element as comment.
Rdo_newline
gives an Rd element representing an empty line.
x
with its "Rd_tag
" set to
name
(Rdo_tag
),
"TEXT" (Rdo_text
),
"VERB" (Rdo_verb
) or
"RCODE" (Rdo_Rcode
).
Georgi N. Boshnakov
Give the Rd tags at the top level of an Rd object.
Rdo_tags(rdo, nulltag = "")
Rdo_tags(rdo, nulltag = "")
rdo |
an Rd object. |
nulltag |
a value to use when |
The "Rd_tag"
attributes of the top level elements of rdo
are
collected in a character vector. Argument nulltag
is used for
elements without that attribute. This guarantees that the result is a
character vector.
Rdo_tags
is similar to the internal function
tools:::RdTags
. Note that tools:::RdTags
may return a
list in the rare cases when attribute Rd_tags
is not present in
all elements of rdo
.
a character vector
Georgi N. Boshnakov
Rdo_which
,
Rdo_which_tag_eq
,
Rdo_which_tag_in
##---- Should be DIRECTLY executable !! ----
##---- Should be DIRECTLY executable !! ----
For an Rd object imported from a file, this function ensures that fragments that were not not changed during the editing of the object remain unchanged in the exported file. This function is used by reprompt() to ensure exactly that.
rdo_text_restore(cur, orig, pos_list, file)
rdo_text_restore(cur, orig, pos_list, file)
cur |
an Rd object |
orig |
an Rd object |
pos_list |
a list of srcref objects specifying portions of files to replace, see 'Details'. |
file |
a file name, essentially a text representation of
|
This is essentially internal function. It exists because, in general, it is not possible to restore the original Rd file from the Rd object due to the specifications of the Rd format. The file exported from the parsed Rd file is functionally equivalent to the original but equivalent things for the computer are not necessarily equally pleasant for humans.
This function is used by reprompt
when the source is from a
file and the option to keep the source of unchanged sections as in the
original.
todo: needs clean up, there are unnecessary arguments in particular.
the main result is the side effect of replacing sections in
file
not changed by reprompt
with the original ones.
Georgi N. Boshnakov
Find elements of Rd objects for which a condition is true.
Rdo_which(rdo, fun) Rdo_which_tag_eq(rdo, tag) Rdo_which_tag_in(rdo, tags)
Rdo_which(rdo, fun) Rdo_which_tag_eq(rdo, tag) Rdo_which_tag_in(rdo, tags)
rdo |
an Rd object. |
fun |
a function to evaluate with each element of |
tag |
a character string. |
tags |
a character vector. |
These functions return the indices of the (top level) elements of
rdo
which satisfy a condition.
Rdo_which
finds elements of rdo
for which
the function fun
gives TRUE.
Rdo_which_tag_eq
finds elements with a specific Rd_tag
.
Rdo_which_tag_in
finds elements whose Rd_tag
's are among
the ones specified by tags
.
a vector of positive integers
Georgi N. Boshnakov
Rdo_locate
which searches recursively the Rd object.
## get the help page for topoc seq() rdo_seq <- tools::Rd_db("base")[["seq.Rd"]] ## find location of aliases in the topic ( ind <- Rdo_which_tag_eq(rdo_seq, "\alias") ) ## extract the first alias rdo_seq[[ ind[1] ]] ## Not run: ## extract all aliases rdo_seq[ind] ## End(Not run) ## db_bibtex <- tools::Rd_db("bibtex") ## names(db_bibtex) ## ## Rdo object for read.bib() ## rdo_read.bib <- db_bibtex[["read.bib.Rd"]] ## Rdo_tags(rdo_read.bib) ## ## ## which elements of read.bib are aliases? ## Rdo_which_tag_eq(rdo_read.bib, "\alias") ## rdo_read.bib[[3]] ## ## ## which elements of read.bib contain R code? ## Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "RCODE") ) ## rdo_read.bib[[5]] ## ## which contain prose? ## Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "TEXT") )
## get the help page for topoc seq() rdo_seq <- tools::Rd_db("base")[["seq.Rd"]] ## find location of aliases in the topic ( ind <- Rdo_which_tag_eq(rdo_seq, "\alias") ) ## extract the first alias rdo_seq[[ ind[1] ]] ## Not run: ## extract all aliases rdo_seq[ind] ## End(Not run) ## db_bibtex <- tools::Rd_db("bibtex") ## names(db_bibtex) ## ## Rdo object for read.bib() ## rdo_read.bib <- db_bibtex[["read.bib.Rd"]] ## Rdo_tags(rdo_read.bib) ## ## ## which elements of read.bib are aliases? ## Rdo_which_tag_eq(rdo_read.bib, "\alias") ## rdo_read.bib[[3]] ## ## ## which elements of read.bib contain R code? ## Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "RCODE") ) ## rdo_read.bib[[5]] ## ## which contain prose? ## Rdo_which(rdo_read.bib, function(x) any(Rdo_tags(x) == "TEXT") )
Converts an Rd object to Rd format and saves it to a file or returns it as a character vector. It escapes percents where necessary and (optionally) backslashes in the examples section.
Rdo2Rdf(rdo, deparse = FALSE, ex_restore = FALSE, file = NULL, rcode = TRUE, srcfile = NULL)
Rdo2Rdf(rdo, deparse = FALSE, ex_restore = FALSE, file = NULL, rcode = TRUE, srcfile = NULL)
rdo |
an Rd object or a character vector, see ‘Details’. |
deparse |
logical, passed to the print method for Rd objects, see ‘Details’. |
ex_restore |
logical, if |
file |
a filename where to store the result. If |
rcode |
if TRUE, duplicate backslahes in RCODE elements, see Details. |
srcfile |
NULL or a file name, see 'Details'. |
The description here is rather technical and incomplete. In any case it concerns almost exclusively Rd files which use escape sequences containing multiple consecutive backslashes or escaped curly braces (such things appear in regular expressions, for example).
In principle, this function should be redundant, since the
print
and as.character
methods for objects of class "Rd"
would be expected to do the job. I was not able to get the desired
result that way (the deparse
option to print
did not
work completely for me either).
Arguments ex_restore
and rcode
were added on an ad-hoc
basis. rcode
is more recent and causes Rdo2Rdf
to
duplicate backslashes found in any element Rd_tag
-ed with
"RCODE". ex_restore
does the same but only for the examples
section. In effect, if rcode
is TRUE, ex_restore
is
ignored.
The initial intent of this function (and the package Rdpack as a whole
was not to refer to the Rd source file. However, there is some
flexibility in the Rd syntax that does not allow the source file to be
restored identically from the parsed object. This concerns mainly
backslahes (and to some extent curly braces) which in certain contexts
may or may not be escaped and the parsed object is the same. Although
this does not affect functionality, it may be annoying if the escapes
in sections not examined by reprompt
were changed.
If srcfile
is the name of a file, the file is parsed and the Rd
text of sections of rdo
that are identical to sections from
srcfile
is taken directly from srcfile
, ensuring that
they will be identical to the original.
NULL
, if file
is not NULL
. Otherwise the Rd
formatted text as a character vector.
Here is an example when the author's Rd source cannot be restored exactly from the parsed object.
In the Rd source "author" has two backslashes here: \author
.
In the Rd source "author" has one backslash here: \author
.
Both sentences are correct and the parsed file contains only one
backslash in both cases. If reprompt
looks only at the parsed
object it will export one backslash in both cases. So, further
reprompt()-ing will not change them again. This is if reprompt
is called with sec_copy = FALSE
. With the default
sec_copy = TRUE
, reprompt
calls Rdo2Rdf
with
argument srcfile
set to the name of the Rd file and since
reprompt
does not modify section "Note", its text is copied
from the file and the author's original preserved.
However, the arguments of \eqn
are parse_Rd-ed differently (or
so it seems) even though they are also in verbatim.
Georgi N. Boshnakov
# # this keeps the backslashes in "author" (see Note above) # reprompt(infile="./man/Rdo2Rdf.Rd") # # this outputs "author" preceded by one backslash only. # reprompt(infile="./man/Rdo2Rdf.Rd", sec_copy = FALSE)
# # this keeps the backslashes in "author" (see Note above) # reprompt(infile="./man/Rdo2Rdf.Rd") # # this outputs "author" preceded by one backslash only. # reprompt(infile="./man/Rdo2Rdf.Rd", sec_copy = FALSE)
Set up a custom style for references in help pages.
Rdpack_bibstyles(package, authors)
Rdpack_bibstyles(package, authors)
package |
the name of a package, a character string. |
authors |
if equal to "LongNames", use full names of authors in reference lists, see Details. |
This is the initial implementation of support for styles for lists of bibliography references.
Currently setting authors
to "LongNames"
will cause the
references to appear with full names, eg John Smith rather than in the
default Smith J style.
Package authors can request this feature by adding the following line
to their .onLoad
function (if their package has one):
Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames")
of just copy the following definition in a package that does not have
.onLoad
:
.onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) }
After building and installing the package the references should be using long names.
in .onLoad(), the function is used purely to set up a bibstyle as discussed in Details.
Internally, Rdpack uses it to extract styles set up by packages:
- if called with argument package
only, the style requested
by that package;
- if called with no arguments, a list of all styles.
Georgi N. Boshnakov
Replace the contents of a section in one or more Rd files.
Rdreplace_section(text, sec, pattern, path = "./man", exclude = NULL, ...)
Rdreplace_section(text, sec, pattern, path = "./man", exclude = NULL, ...)
text |
the replacement text, a character string. |
sec |
the name of the section without the leading backslash, as
for |
pattern |
regular expression for R files to process, see Details. |
path |
the directory were to look for the Rd files. |
exclude |
regular expression for R files to exclude, see Details. |
... |
not used. |
Rdreplace_section
looks in the directory specified by
path
for files whose names match pat
and drops those
whose names match exclude
. Then it replaces section sec
in the files selected in this way.
Rdreplace_section
is a convenience function to replace a
section (such as a keyword or author) in several files in one go.
It calls Rdo_set_section
to do the work.
A vector giving the full names of the processed Rd files, but the function is used for the side effect of modifying them as described in section Details.
Georgi N. Boshnakov
## Not run: # replace the author in all Rd files except pkgname-package Rdreplace_section("A. Author", "author", ".*[.]Rd$", exclude = "-package[.]Rd$") ## End(Not run)
## Not run: # replace the author in all Rd files except pkgname-package Rdreplace_section("A. Author", "author", ".*[.]Rd$", exclude = "-package[.]Rd$") ## End(Not run)
Work with bibtex references in Rd documentation.
rebib(infile, outfile, ...) inspect_Rdbib(rdo, force = FALSE, ...)
rebib(infile, outfile, ...) inspect_Rdbib(rdo, force = FALSE, ...)
infile |
name of the Rd file to update, a character string. |
outfile |
a filename for the updated Rd object. |
... |
further arguments to be passed to
|
rdo |
an Rd object. |
force |
if TRUE, re-insert previously imported references. Otherwise do not change such references. |
inspect_Rdbib
takes an Rd object and processes the references
as specified below.
The user level function is rebib
. It parses the Rd file
infile
, calls inspect_Rdbib
to process the references,
and writes the modified Rd object to file outfile
.
If outfile
is missing it is set to the basename of
infile
. If outfile
is the empty string, ""
, then
outfile
is set to infile
.
The default Bibtex file is "REFERENCES.bib" in the current working
directory. Arguments "..." can be used to change the name of the bib
file and its location. Argument bibfile
can be used to
overwrite the default name of the bib file. Argument package
can be used to specify that the bib file should be taken from the root
of the installation directory of package package
, see
get_bibentries
for details.
The following scheme can be used for incorporation of bibliographic
references from BibTeX files. Note however, that usually it is more
convenient to use the approach based on Rd macros like
\insertRef
, see insert_ref
and the vignette(s).
The Bibtex key for each reference is put in a comment line in the references section, as in
\references{ % bibentry: key1 % bibentry: key2 ... }
At least one space after the colon, ':', is required, spaces before "bibentry:" are ignored.
Then run rebib()
on the file, see the example section for a way
to run rebib()
on all files in one go.
Each reference is inserted immediately after the comment line specifying it and a matching comment line marking its end is inserted.
Before inserting a reference, a check for the matching ending line is made, and if such a line is found, the reference is not inserted. This means that to add new references it is sufficient to give their keys, as described above and run the function again. References that are already there will not be duplicated.
The inserted reference may also be edited, if necessary. As long as the two comment lines enclosing it are not removed, the reference will not be overwritten by subsequent calls of the functions described here. Any text outside the markers delineating references inserted by this mechanism is left unchanged, including references inserted by other means.
To include all references from the bib file, the following line can be used:
% bibentry:all
Notice that there is no space after the colon in this case.
In this case a marker is put after the last reference and the whole
thing is considered one block. So, if the end marker is present and
force
is FALSE, none will will be changed. Otherwise, if
force
is TRUE, the whole block of references will be removed
and all references currently in the bib file will be inserted.
The main purpose of bibentry:all
is for use in a package
overview file. The reference section in the file "package-package"
generated by promptPackageSexpr
uses this feature (but
the user still needs to call rebib
to insert the references).
for inspect_Rdbib
, the modified Rd object.
rebib
is used mainly for the side effect of creating a file
with the references updated. It returns the Rd object created by
parsing and modifying the Rd file.
Georgi N. Boshnakov
insert_ref
and the vignette(s) for the recommended way
to import BibTeX references and citations.
## Not run: # update references in all Rd files in the package's 'man' directory # rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) lapply(rdnames, function(x) rebib(x, package="Rdpack")) ## End(Not run)
## Not run: # update references in all Rd files in the package's 'man' directory # rdnames <- dir(path = "./man", pattern=".*[.]Rd$", full.names=TRUE) lapply(rdnames, function(x) rebib(x, package="Rdpack")) ## End(Not run)
Examine the documentation of functions, methods or classes and update it with additional arguments, aliases, methods or slots, as appropriate. This is an extention of the promptXXX() family of functions.
reprompt(object, infile = NULL, Rdtext = NULL, final = TRUE, type = NULL, package = NULL, methods = NULL, verbose = TRUE, filename = NULL, sec_copy = TRUE, edit = FALSE, ...)
reprompt(object, infile = NULL, Rdtext = NULL, final = TRUE, type = NULL, package = NULL, methods = NULL, verbose = TRUE, filename = NULL, sec_copy = TRUE, edit = FALSE, ...)
object |
the object whose documentation is to be updated, such as a string, a function, a help topic, a parsed Rd object, see ‘Details’. |
infile |
a file name containing Rd documentation, see ‘Details’. |
Rdtext |
a character string with Rd formatted text, see ‘Details’. |
final |
logical, if |
type |
type of topic, such as |
package |
package name; document only objects defined in this package, especially useful for methods, see ‘Details’. |
methods |
used for documentation of S4 methods only, rarely needed even for
them. This argument is passed on to
|
verbose |
if |
filename |
name of the file for the generated Rd content; if
|
... |
currently not used. |
sec_copy |
if |
edit |
if |
The typical use of reprompt
is with one argument, as in
reprompt(infile = "./Rdpack/man/reprompt.Rd") reprompt(reprompt) reprompt("reprompt")
reprompt
updates the requested documentation and writes the new
Rd file in the current working directory. When argument infile
is used, the descriptions of all objects described in the input file
are updated. When an object or its name is given, reprompt
looks first for installed documentation and processes it in the same
way as in the case of infile
. If there is no documentation for
the object, reprompt
creates a skeleton Rd file similar to the
one produced by the base R functions from the prompt
family (if
final = TRUE
, the default, it modifies the output of
prompt()
, so that the package can be built).
To document a function, say myfun
, in an existing Rd file, just
add myfun()
to the usage section in the file and call
reprompt()
on that file. Put quotes around the function name if
it is non-syntactic. For replacement functions (functions with names
ending in <-
) reprompt()
will insert the proper usage
statement. For example, if the signature of xxx<-
is (x,
..., value)
then both, "xxx<-"()
and xxx() <- value
will be replaced by xxx(x, ...) <- value
.
For S4 methods and classes the argument "package" is often needed to restrict the output to methods defined in the package of interest.
reprompt("myfun-methods") reprompt("[<--methods", package = "mypackage") reprompt("[<-", type = "methods", package = "mypackage") # same reprompt("myclass", type = "class", package = "mypackage") reprompt("myclass-class", package = "mypackage") # same
Without the "package" argument the reprompt for "[<-"
would give
all methods defined by loaded packages at the time of the call.
Currently reprompt
functionality is not implemented for topic
"package" but if object
has the form "name-package" (or the
equivalent with argument topic
) and there is no documentation
for package?name
, reprompt
calls
promptPackageSexpr
to create the required shell.
Note that the shell produced by promptPackageSexpr
does not
need ‘reprompting’ since the automatically generated information is
included by \Sexpr
's, not literal strings.
Below are the details.
Typically, only one of object
, infile
, and Rdtext
is supplied. Warning messages are issued if this is not the case.
The object must have been made available by the time when
reprompt()
is issued. If the object is in a package this is
typically achieved by a library()
command.
object
may be a function or a name, as accepted by the ?
operator. If it has the form "name-class" and "name-methods" a
documentation shell for class "name" or the methods for generic function
"name" will be examined/created. Alternatively, argument type
may be set to "class" or "methods" to achieve the same effect.
infile
specifies a documentation file to be updated. If it
contains the documentation for one or more functions, reprompt
examines their usage statements and updates them if they have
changed. It also adds arguments to the "arguments" section if not all
arguments in the usage statements have entries there. If infile
describes the methods of a function or a class, the checks made are as
appropriate for them. For example, new methods and/or slots are added
to the corresponding sections.
It is all too easy in interactive use to forget to name the
infile
argument, comparereprompt("./man/reprompt.Rd")
vs.
reprompt(infile = "./man/reprompt.Rd")
).
A convenience feature is that if infile
is missing
and object
is a character string ending in ".Rd" and containing
a forward slash (i.e. it looks like Rd file in a directory), then it
is taken to be infile
.
Rdtext
is similar to infile
but the Rd content is taken
from a character vector.
If Rd content is supplied by infile
or Rdtext
,
reprompt
uses it as a basis for comparison. Otherwise it tries
to find installed documentation for the object or topic requested.
If that fails, it resorts to one of the promptXXX
functions to
generate a documentation shell. If that also fails, the requested
object or topic does not exist.
If the above succeeds, the function examines the current definition of the requested object(s), methods, or class and amends the documentation with any additional items it finds.
For Rd objects describing one or more functions, the usage expressions are checked and replaced, if they have changed. Arguments appearing in one or more usage expressions and missing from section "Arguments" are amended to it with content "Describe ..." and a message is printed. Arguments no longer in the usage statements are NOT removed but a message is issued to alert the user. Alias sections are inserted for any functions with "usage" but without "alias" section.
If filename
is a character string, it is used as is, so any
path should be included in the string. Argument filename
usuallly is omitted since the automatically generated file name is
suitable in most cases. Exceptions are functions with non-standard
names (such as replacement functions whose names end in "<-"
)
for which the generated file names may not be acceptable on some
operating systems.
If filename
is missing or NULL
, a suitable name is
generated as follows. If infile
is supplied, filename
is
set to a file with the same name in the current working directory
(i.e. any path information in infile
is dropped). Otherwise,
filename
is obtained by appending the name tag of the Rd object
with ".Rd"
.
If filename
is TRUE
, it is set to infile
or, if
infile
is missing or NULL
, a suitable name is generated
as above. This can be used to change infile
in place.
If filename
is FALSE
, the Rd text is returned as a
character vector and not written to a file.
If edit
is TRUE
, the reprompted file is opened in an
editor, see also ereprompt
(‘e’ for ‘edit’) which is
like reprompt
but has as default edit = TRUE
and some
other related settings.
file.edit()
is used to call the editor. Which editor is opened
depends on the OS and on the user configuration. RStudio users will
probably prefer the 'Reprompt' add-in or the underlying function
RStudio_reprompt
. Emacs users would normally have set
up emacsclient
as their editor and this is automatically done
by EMACS/ESS (even on Windows).
If argument sec_copy
is TRUE
(the default),
reprompt
will, effectively, copy the contents of (some)
unchanged sections, thus ensuring that they are exactly the same as in
the original. This needs additional work, since parsing an Rd file
and then exporting the created Rd object to an Rd file does not
necessarilly produce an identical Rd file (some escape sequences may
be changed in the process, for example). Even though the new version
should be functionally equivalent to the original, such changes are
usually not desirable. For example, if such changes creep into the
Details section (which reprompt
never changes) the user may be
annoyed or worried.
if filename
is a character string or NULL
, the name of
the file to which the updated shell was written.
Otherwise, the Rd text is returned as a character vector.
The arguments of reprompt
are similar to prompt, with some
additions. As in prompt
, filename
specifies the output
file. In reprompt
a new argument, infile
, specifies the
input file containing the Rd source.
When reprompt
is used to update sources of Rd documentation for
a package, it is best to supply the original Rd file in argument
infile
. Otherwise, if the original Rd file contains
\Sexpr
commands, reprompt
may not be able to recover the
original Rd content from the installed documentation. Also, the fields
(e.g. the keywords) in the installed documentation may not be were you
expect them to be. (This may be addressed in a future revision.)
While reprompt
adds new items to the documentation, it never
removes existing content. It only issues a suggestion to remove an
item, if it does not seem necessary any more (e.g. a removed argument
from a function definition).
reprompt
handles usage statements for S3 and S4 methods
introduced with any of the macros \method
, \S3method
and
\S4method
, as in
\method{fun}{class}(args...)
. reprompt
understands also
subsetting ans subassignment operators. For example, suppose that the
\arguments
section of file "bracket.Rd" contains these
directives (or any other wrong signatures):
\method{[}{ts}() \method{[[}{Date}()
Then reprompt("./bracket.Rd")
will change them to
\method{[}{ts}(x, i, j, drop = TRUE) \method{[[}{Date}(x, \dots, drop = TRUE)
This works for the assignment operators and functions, as well. For example, any of these
\method{`[<-`}{POSIXlt}() \method{[}{POSIXlt}(x, j) <- value
will be converted by reprompt
to the standard form
\method{[}{POSIXlt}(x, i, j) <- value
Note that the quotes in `[<-`
above.
Usage statements for functions are split over two or more lines if necessary. The user may edit them afterwards if the automatic splitting is not appropriate, see below.
The usage section of Rd objects describing functions is left intact if
the usage has not changed. To force reprompt
to recreate the
usage section (e.g. to reformat long lines), invalidate the usage of
one of the described functions by removing an argument from its usage
expression. Currently the usage section is recreated completely if
the usage of any of the described functions has changed. Manual
formatting may be lost in such cases.
Georgi N. Boshnakov
ereprompt
which by default calls the editor on the
original file
## note: usage of reprompt() is simple. the examples below are bulky ## because they simulate various usage scenarios with commands, ## while in normal usage they would be due to editing. ## change to a temporary directory to avoid clogging up user's cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## as for prompt() the default is to save in current dir as "seq.Rd". ## the argument here is a function, reprompt finds its doc and ## updates all objects described along with `seq'. ## (In this case there is nothing to update, we have not changed `seq'.) fnseq <- reprompt(seq) ## let's parse the saved Rd file (the filename is returned by reprompt) rdoseq <- tools::parse_Rd(fnseq) # parse fnseq to see the result. Rdo_show(rdoseq) ## we replace usage statements with wrong ones for illustration. ## (note there is an S3 method along with the functions) dummy_usage <- char2Rdpiece(paste("seq()", "\\method{seq}{default}()", "seq.int()", "seq_along()", "seq_len()", sep="\n"), "usage") rdoseq_dummy <- Rdo_replace_section(rdoseq, dummy_usage) Rdo_show(rdoseq_dummy) # usage statements are wrong reprompt(rdoseq_dummy, file = "seqA.Rd") Rdo_show(tools::parse_Rd("seqA.Rd")) # usage ok after reprompt ## define function myseq() myseq <- function(from, to, x){ if(to < 0) { seq(from = from, to = length(x) + to) } else seq(from, to) } ## we wish to describe myseq() along with seq(); ## it is sufficient to put myseq() in the usage section ## and let reprompt() do the rest rdo2 <- Rdo_modify_simple(rdoseq, "myseq()", "usage") reprompt(rdo2, file = "seqB.Rd") # updates usage of myseq ## show the rendered result: Rdo_show(tools::parse_Rd("seqB.Rd")) ## Run this if you wish to see the Rd file: ## file.show("seqB.Rd") reprompt(infile = "seq.Rd", filename = "seq2.Rd") reprompt(infile = "seq2.Rd", filename = "seq3.Rd") ## Rd objects for installed help may need some tidying for human editing. #hseq_inst <- help("seq") #rdo <- utils:::.getHelpFile(hseq_inst) rdo <- Rdo_fetch("seq", "base") rdo rdo <- Rdpack:::.Rd_tidy(rdo) # tidy up (e.g. insert new lines # for human readers) reprompt(rdo) # rdo and rdoseq are equivalent all.equal(reprompt(rdo), reprompt(rdoseq)) # TRUE ## clean up unlink("seq.Rd") # remove temporary files unlink("seq2.Rd") unlink("seq3.Rd") unlink("seqA.Rd") unlink("seqB.Rd") setwd(cur_wd) # restore user's working directory unlink(tmpdir)
## note: usage of reprompt() is simple. the examples below are bulky ## because they simulate various usage scenarios with commands, ## while in normal usage they would be due to editing. ## change to a temporary directory to avoid clogging up user's cur_wd <- getwd() tmpdir <- tempdir() setwd(tmpdir) ## as for prompt() the default is to save in current dir as "seq.Rd". ## the argument here is a function, reprompt finds its doc and ## updates all objects described along with `seq'. ## (In this case there is nothing to update, we have not changed `seq'.) fnseq <- reprompt(seq) ## let's parse the saved Rd file (the filename is returned by reprompt) rdoseq <- tools::parse_Rd(fnseq) # parse fnseq to see the result. Rdo_show(rdoseq) ## we replace usage statements with wrong ones for illustration. ## (note there is an S3 method along with the functions) dummy_usage <- char2Rdpiece(paste("seq()", "\\method{seq}{default}()", "seq.int()", "seq_along()", "seq_len()", sep="\n"), "usage") rdoseq_dummy <- Rdo_replace_section(rdoseq, dummy_usage) Rdo_show(rdoseq_dummy) # usage statements are wrong reprompt(rdoseq_dummy, file = "seqA.Rd") Rdo_show(tools::parse_Rd("seqA.Rd")) # usage ok after reprompt ## define function myseq() myseq <- function(from, to, x){ if(to < 0) { seq(from = from, to = length(x) + to) } else seq(from, to) } ## we wish to describe myseq() along with seq(); ## it is sufficient to put myseq() in the usage section ## and let reprompt() do the rest rdo2 <- Rdo_modify_simple(rdoseq, "myseq()", "usage") reprompt(rdo2, file = "seqB.Rd") # updates usage of myseq ## show the rendered result: Rdo_show(tools::parse_Rd("seqB.Rd")) ## Run this if you wish to see the Rd file: ## file.show("seqB.Rd") reprompt(infile = "seq.Rd", filename = "seq2.Rd") reprompt(infile = "seq2.Rd", filename = "seq3.Rd") ## Rd objects for installed help may need some tidying for human editing. #hseq_inst <- help("seq") #rdo <- utils:::.getHelpFile(hseq_inst) rdo <- Rdo_fetch("seq", "base") rdo rdo <- Rdpack:::.Rd_tidy(rdo) # tidy up (e.g. insert new lines # for human readers) reprompt(rdo) # rdo and rdoseq are equivalent all.equal(reprompt(rdo), reprompt(rdoseq)) # TRUE ## clean up unlink("seq.Rd") # remove temporary files unlink("seq2.Rd") unlink("seq3.Rd") unlink("seqA.Rd") unlink("seqB.Rd") setwd(cur_wd) # restore user's working directory unlink(tmpdir)
This function uses the RStudio API to call reprompt
on either the current help file in the editor, or if a name
is highlighted in a ‘.R’ file, on that object.
RStudio_reprompt(verbose = TRUE)
RStudio_reprompt(verbose = TRUE)
verbose |
If |
This function depends on being run in RStudio; it will generate an error if run in other contexts.
It depends on code being in a package that has already been built, installed, and attached. In RStudio, this means you should run “Install and Restart” before running this function.
It is automatically installed into RStudio as an add-in called
“Reprompt”. Whether invoked directly or through the
add-in, it looks at the file currently being edited in the
code editor. If it is an ‘.Rd’ file, it will run
reprompt
on that file.
If it is an R source file, it will look for a selected object name. It queries the help system to find if there is already a help page for that name, and if so, works on that. If not, it will try to create one.
NULL
, invisibly.
Duncan Murdoch
Give the formal arguments of an S4 method.
S4formals(fun, ...)
S4formals(fun, ...)
fun |
name of an S4 generic, a string, or the method, see Details. |
... |
further arguments to be passed to |
S4formals
gives the formal arguments of the requested method.
If fun
is not of class methodDefinition
, it calls
getMethods
, passing on all arguments.
Typically, fun
is the name of a generic function and the
second argument is the signature of the method as a character
vector. Alternatively, fun
may be the method itself (e.g. obtained
previously from getMethod
) and in that case the "\dots"
arguments are ignored. See getMethod
for full details
and other acceptable arguments.
a pairlist, like formals
Arguments of a method after those used for dispatch may be different from
the arguments of the generic. The latter may simply have a "\dots"
argument there.
todo: there should be a similar function in the "methods" package, or at least use a documented feature to extract it.
Georgi N. Boshnakov
require(stats4) # makes plot() S4 generic S4formals("plot", c(x = "profile.mle", y = "missing")) m1 <- getMethod("plot", c(x = "profile.mle", y = "missing")) S4formals(m1)
require(stats4) # makes plot() S4 generic S4formals("plot", c(x = "profile.mle", y = "missing")) m1 <- getMethod("plot", c(x = "profile.mle", y = "missing")) S4formals(m1)
Update aliases for methods in Rd objects
update_aliases_tmp(rdo, package = NULL)
update_aliases_tmp(rdo, package = NULL)
rdo |
an Rd object |
package |
the name of a package, a character string. |
This is a quick fix. todo: complete it!
the updated Rd object
Georgi N. Boshnakov
View Rd files in a source package.
viewRd(infile, type = getOption("help_type"), stages = NULL)
viewRd(infile, type = getOption("help_type"), stages = NULL)
infile |
name of an Rd file, a character string. |
type |
one of |
stages |
a character vector specifying which stages of the R installation
process to immitate. The default,
|
This function can be used to view Rd files from the source directory
of a package. The page is presented in text format or in html browser,
according to the setting of argument type
. The default is
getOption("help_type")
.
the function is used for the side effect of showing the help page in a text help window or a web browser.
Developers with "devtools"
can use viewRd()
instead of
help()
for documentation objects that contain Rd macros, such
as insertRef
, see vignette:
vignette("Inserting_bibtex_references", package = "Rdpack")
.
Georgi N. Boshnakov