-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Hi all,
I wanted to set up my first (private) R-package and wondered
if there was a function to prompt() for multiple aliases in one Rd-file,
e.g. to create something like the normal distribution manual page
encompassing rnorm, dnorm,...
As I didn't find it, I modified prompt.default() and wrote a small function
to do this job, called "promptFunctions". It basically calls the
helper
".promptFunction" for every name it gets and puts together the output
from each function.
It would be interesting for me if such a function already existed in R
or if something like "promptFunction" could be included in any future
R
version.
I think it would be used as many man pages document several functions at
once,
and cutting and pasting the single prompt() files by hand could be boring.
regards,
Daniel
The Code:
## modified prompt.default to handle multiple functions correctly
promptFunctions <-
~ function (..., # objects to be documented
~ filename = NULL, # file name string or NA for
console
~ names = NULL, # character vector of object names
~ rdname = NULL, # name of the documentation
~ overwrite = FALSE # overwrite existing Rd file?
~ )
{
~ ## helper functions
~ paste0 <- function(...) paste(..., sep = "")
~ is.missing.arg <- function(arg) typeof(arg) == "symbol"
&&
~ deparse(arg) == ""
~ ## generate additional names from objects
~ objects <- as.list (substitute (...[]))
~ objects <- objects[seq(from = 2, to = length(objects) - 1)]
~ objects <- sapply(objects, deparse)
~ ## merge with names from call and stop if there are no usable names
~ names <- unique(c(objects, names))
~ if (is.null(names))
~ stop ("cannot determine usable names")
~ ## determine Rd name
~ if(is.null(rdname))
~ rdname <- names[1]
~ ## determine file name
~ if (is.null(filename))
~ filename <- paste0(rdname, ".Rd")
~ ## treat each name individually
~ promptList <- lapply(names, .promptFunction)
~ names(promptList) <- names
~ ## construct text
~ Rdtxt <- list()
~ Rdtxt$name <- paste0("\\name{", rdname, "}")
~ Rdtxt$aliases <- c(paste0("\\alias{", names, "}"),
~ paste("%- Also NEED an '\\alias' for EACH
other
topic",
~ "documented here."))
~ Rdtxt$title <- "\\title{ ~~functions to do ... ~~ }"
~ Rdtxt$description <- c("\\description{",
~ paste(" ~~ A concise (1-5 lines)
description of what",
~ "the functions"),
~ paste(" ", paste(names, collapse =
", "),
~ "do. ~~"),
~ "}")
~ Rdtxt$usage <- c("\\usage{",
~ unlist(lapply(promptList, "[[",
"usage")),
~ "}",
~ paste("%- maybe also 'usage' for other
objects",
~ "documented here."))
~ arguments <- unique (unlist (lapply(promptList, "[[",
"arg.n")))
~ Rdtxt$arguments <- if(length(arguments))
~ c("\\arguments{",
~ paste0(" \\item{", arguments, "}{",
~ " ~~Describe \\code{", arguments, "} here~~
}"),
~ "}")
~ Rdtxt$details <- c("\\details{",
~ paste(" ~~ If necessary, more details than
the",
~ "description above ~~"),
~ "}")
~ Rdtxt$value <- c("\\value{",
~ " ~Describe the values returned",
~ " If it is a LIST, use",
~ " \\item{comp1 }{Description of
'comp1'}",
~ " \\item{comp2 }{Description of
'comp2'}",
~ " ...",
~ "}")
~ Rdtxt$references <- paste("\\references{ ~put references to
the",
~ "literature/web site here ~ }")
~ Rdtxt$author <- "\\author{Daniel Saban\\'es Bov\\'e}"
~ Rdtxt$note <- c("\\note{ ~~further notes~~ ",
~ "",
~ paste(" ~Make other sections like Warning with",
~ "\\section{Warning }{....} ~"),
~ "}")
~ Rdtxt$seealso <- paste("\\seealso{ ~~objects to See Also as",
~ "\\code{\\link{help}}, ~~~ }")
~ Rdtxt$examples <- c("\\examples{",
~ "##---- Should be DIRECTLY executable !!
----",
~ "##-- ==> Define data, use random,",
~ "##--\tor do help(data=index) for the
standard data sets.",
~ "",
~ "## The functions are currently defined as",
~ unlist (lapply(promptList, "[[",
"x.def")),
~ "}")
~ Rdtxt$keywords <- c(paste("% Add one or more standard
keywords,",
~ "see file 'KEYWORDS' in the"),
~ "% R documentation directory.",
~ "\\keyword{ ~kwd1 }",
~ "\\keyword{ ~kwd2 }% __ONLY ONE__ keyword per
line")
~ ## and write text to console
~ if (is.na(filename))
~ return(Rdtxt)
~ ## or file
~ if(file.exists(filename) && !overwrite)
~ warning(filename, " already exists. Choose overwrite = TRUE to
force.")
~ else {
~ cat(unlist(Rdtxt), file = filename, sep = "\n")
~ message(gettextf("Created file named '%s'.",
filename), "\n",
~ gettext("Edit the file and move it to the appropriate
directory."),
~ domain = NA)
~ }
~ ## and return the file name
~ invisible(filename)
}
## helper function for one name only
.promptFunction <- function(name, ...)
{
~ ## utility functions
~ paste0 <- function(...) paste(..., sep = "")
~ is.missing.arg <- function(arg)
~ typeof(arg) == "symbol" && deparse(arg) ==
""
~ ## get object by name
~ x <- get(name, envir = parent.frame())
~ ## set up return list
~ ret <- list()
~ ## extract arguments
~ n <- length(argls <- formals(x))
~ if (n > 0) {
~ arg.names <- arg.n <- names(argls)
~ arg.n[arg.n == "..."] <- "\\dots"
~ }
~ Call <- paste0(name, "(")
~ for (i in seq_len(n)) {
~ Call <- paste0(Call, arg.names[i], if (!is.missing.arg(argls[[i]]))
~ paste0(" = ", paste(deparse(argls[[i]],
width.cutoff = 500),
~ collapse = "\n")))
~ if (i != n)
~ Call <- paste0(Call, ", ")
~ }
~ ## and definition of the function
~ x.def <- attr(x, "source")
~ if (is.null(x.def))
~ x.def <- deparse(x)
~ if (any(br <- substr(x.def, 1, 1) == "}"))
~ x.def[br] <- paste(" ", x.def[br])
~ x.def <- gsub("%", "\\\\%", x.def)
~ x.def <- c(paste("##", name), x.def)
~ ## fill return list
~ ret$usage <- paste0(Call, ")")
~ ret$x.def <- x.def
~ ret$arg.n <- if(n > 0) arg.n
~ ## return the list
~ return(ret)
}
## test this
test <- function(x){
~ x + 5
}
b <- function(y)
~ test(y)
y <- function(a, b, c){
~ print("hello")
}
promptFunctions(test, b, names = "y", rdname = "testbandy")
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4-svn0 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
iD8DBQFIAh46zHZ0x5+gF9kRCnaOAJ9MQGHjosFEFshWYxAbfQ0E7fOsGQCfX2gp
F0pJGX4/mai08ghJwj6yY18=7r90
-----END PGP SIGNATURE-----
Daniel, Check out the promptAll() function in the SoDA package on CRAN. (Because it was written as an example for my new book, it's not the fanciest imaginable, but seems to work OK.) John Daniel Saban?s Bov? wrote:> -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > Hi all, > > I wanted to set up my first (private) R-package and wondered > if there was a function to prompt() for multiple aliases in one Rd-file, > e.g. to create something like the normal distribution manual page > encompassing rnorm, dnorm,... > > As I didn't find it, I modified prompt.default() and wrote a small function > to do this job, called "promptFunctions". It basically calls the helper > ".promptFunction" for every name it gets and puts together the output > from each function. > > It would be interesting for me if such a function already existed in R > or if something like "promptFunction" could be included in any future R > version. > I think it would be used as many man pages document several functions at > once, > and cutting and pasting the single prompt() files by hand could be boring. > > regards, > Daniel > > The Code: > > ## modified prompt.default to handle multiple functions correctly > promptFunctions <- > ~ function (..., # objects to be documented > ~ filename = NULL, # file name string or NA for > console > ~ names = NULL, # character vector of object names > ~ rdname = NULL, # name of the documentation > ~ overwrite = FALSE # overwrite existing Rd file? > ~ ) > { > ~ ## helper functions > ~ paste0 <- function(...) paste(..., sep = "") > ~ is.missing.arg <- function(arg) typeof(arg) == "symbol" && > ~ deparse(arg) == "" > > ~ ## generate additional names from objects > ~ objects <- as.list (substitute (...[])) > ~ objects <- objects[seq(from = 2, to = length(objects) - 1)] > ~ objects <- sapply(objects, deparse) > > ~ ## merge with names from call and stop if there are no usable names > ~ names <- unique(c(objects, names)) > ~ if (is.null(names)) > ~ stop ("cannot determine usable names") > > ~ ## determine Rd name > ~ if(is.null(rdname)) > ~ rdname <- names[1] > > ~ ## determine file name > ~ if (is.null(filename)) > ~ filename <- paste0(rdname, ".Rd") > > ~ ## treat each name individually > ~ promptList <- lapply(names, .promptFunction) > ~ names(promptList) <- names > > ~ ## construct text > ~ Rdtxt <- list() > > ~ Rdtxt$name <- paste0("\\name{", rdname, "}") > ~ Rdtxt$aliases <- c(paste0("\\alias{", names, "}"), > ~ paste("%- Also NEED an '\\alias' for EACH other > topic", > ~ "documented here.")) > ~ Rdtxt$title <- "\\title{ ~~functions to do ... ~~ }" > ~ Rdtxt$description <- c("\\description{", > ~ paste(" ~~ A concise (1-5 lines) > description of what", > ~ "the functions"), > ~ paste(" ", paste(names, collapse = ", "), > ~ "do. ~~"), > ~ "}") > ~ Rdtxt$usage <- c("\\usage{", > ~ unlist(lapply(promptList, "[[", "usage")), > ~ "}", > ~ paste("%- maybe also 'usage' for other objects", > ~ "documented here.")) > ~ arguments <- unique (unlist (lapply(promptList, "[[", "arg.n"))) > ~ Rdtxt$arguments <- if(length(arguments)) > ~ c("\\arguments{", > ~ paste0(" \\item{", arguments, "}{", > ~ " ~~Describe \\code{", arguments, "} here~~ }"), > ~ "}") > ~ Rdtxt$details <- c("\\details{", > ~ paste(" ~~ If necessary, more details than the", > ~ "description above ~~"), > ~ "}") > ~ Rdtxt$value <- c("\\value{", > ~ " ~Describe the values returned", > ~ " If it is a LIST, use", > ~ " \\item{comp1 }{Description of 'comp1'}", > ~ " \\item{comp2 }{Description of 'comp2'}", > ~ " ...", > ~ "}") > ~ Rdtxt$references <- paste("\\references{ ~put references to the", > ~ "literature/web site here ~ }") > ~ Rdtxt$author <- "\\author{Daniel Saban\\'es Bov\\'e}" > ~ Rdtxt$note <- c("\\note{ ~~further notes~~ ", > ~ "", > ~ paste(" ~Make other sections like Warning with", > ~ "\\section{Warning }{....} ~"), > ~ "}") > ~ Rdtxt$seealso <- paste("\\seealso{ ~~objects to See Also as", > ~ "\\code{\\link{help}}, ~~~ }") > ~ Rdtxt$examples <- c("\\examples{", > ~ "##---- Should be DIRECTLY executable !! ----", > ~ "##-- ==> Define data, use random,", > ~ "##--\tor do help(data=index) for the > standard data sets.", > ~ "", > ~ "## The functions are currently defined as", > ~ unlist (lapply(promptList, "[[", "x.def")), > ~ "}") > ~ Rdtxt$keywords <- c(paste("% Add one or more standard keywords,", > ~ "see file 'KEYWORDS' in the"), > ~ "% R documentation directory.", > ~ "\\keyword{ ~kwd1 }", > ~ "\\keyword{ ~kwd2 }% __ONLY ONE__ keyword per > line") > > ~ ## and write text to console > ~ if (is.na(filename)) > ~ return(Rdtxt) > > ~ ## or file > ~ if(file.exists(filename) && !overwrite) > ~ warning(filename, " already exists. Choose overwrite = TRUE to > force.") > ~ else { > ~ cat(unlist(Rdtxt), file = filename, sep = "\n") > ~ message(gettextf("Created file named '%s'.", filename), "\n", > ~ gettext("Edit the file and move it to the appropriate > directory."), > ~ domain = NA) > ~ } > > ~ ## and return the file name > ~ invisible(filename) > } > > > ## helper function for one name only > .promptFunction <- function(name, ...) > { > ~ ## utility functions > ~ paste0 <- function(...) paste(..., sep = "") > ~ is.missing.arg <- function(arg) > ~ typeof(arg) == "symbol" && deparse(arg) == "" > > ~ ## get object by name > ~ x <- get(name, envir = parent.frame()) > > ~ ## set up return list > ~ ret <- list() > > ~ ## extract arguments > ~ n <- length(argls <- formals(x)) > ~ if (n > 0) { > ~ arg.names <- arg.n <- names(argls) > ~ arg.n[arg.n == "..."] <- "\\dots" > ~ } > ~ Call <- paste0(name, "(") > ~ for (i in seq_len(n)) { > ~ Call <- paste0(Call, arg.names[i], if (!is.missing.arg(argls[[i]])) > ~ paste0(" = ", paste(deparse(argls[[i]], > width.cutoff = 500), > ~ collapse = "\n"))) > ~ if (i != n) > ~ Call <- paste0(Call, ", ") > ~ } > > ~ ## and definition of the function > ~ x.def <- attr(x, "source") > ~ if (is.null(x.def)) > ~ x.def <- deparse(x) > ~ if (any(br <- substr(x.def, 1, 1) == "}")) > ~ x.def[br] <- paste(" ", x.def[br]) > ~ x.def <- gsub("%", "\\\\%", x.def) > ~ x.def <- c(paste("##", name), x.def) > > ~ ## fill return list > ~ ret$usage <- paste0(Call, ")") > ~ ret$x.def <- x.def > ~ ret$arg.n <- if(n > 0) arg.n > > ~ ## return the list > ~ return(ret) > } > > > ## test this > test <- function(x){ > ~ x + 5 > } > b <- function(y) > ~ test(y) > y <- function(a, b, c){ > ~ print("hello") > } > > promptFunctions(test, b, names = "y", rdname = "testbandy") > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.4-svn0 (GNU/Linux) > Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org > > iD8DBQFIAh46zHZ0x5+gF9kRCnaOAJ9MQGHjosFEFshWYxAbfQ0E7fOsGQCfX2gp > F0pJGX4/mai08ghJwj6yY18> =7r90 > -----END PGP SIGNATURE----- > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >
Possibly Parallel Threads
- Xen 4.2.2 /etc/init.d/xendomains save and restore of domains does not work
- Modification-proposal for %% (modulo) when supplied with double
- Rd2dvi (PR#9812)
- R CMD Rdconv drops sections: arguments, seealso, examples (PR#9649)
- Bug#772274: xen-utils-common: when upgrading package: insserv: Service xenstored has to be enabled to start service xendomains