On Thu, 23 Jan 2025 11:16:48 +0100
Kurt Hornik <[email protected]> wrote:
> My guess would be that the new syntax is particularly prominently used
> in examples: if so, it would be good to also have coverage for this.
In today's CRAN snapshot, there turned out to be 198 packages that use
4.1 syntax in examples but not in code, 5 packages that use 4.2 syntax
in examples but 4.1 in the code, and 3 packages that use 4.2 syntax in
examples but not the code. This may be slightly imprecise because I
don't have some of the Rd macro packages installed and run
Rd2ex(stages=NULL) on manually-parsed Rd files without installing the
packages.
Attaching a patch that checks the syntax used in Rd examples at the
same time as the main R code, not necessarily the best way to perform
this check. Is it perhaps worth separating R/* checks from man/*.Rd
checks? Should R CMD check try to reuse the Rd database from the
installed copy of the package?
--
Best regards,
Ivan
Index: src/library/tools/R/utils.R
===================================================================
--- src/library/tools/R/utils.R (revision 87694)
+++ src/library/tools/R/utils.R (working copy)
@@ -2103,6 +2103,38 @@
out
}
+### ** .source_file_using_R_4.x_syntax
+
+.source_file_using_R_4.x_syntax <- function(f)
+{
+ x <- utils::getParseData(parse(f, keep.source = TRUE))
+ i1 <- which(x$token %in% c("PIPE", "'\\\\'"))
+ i2 <- which(x$token == "PLACEHOLDER")
+ if(length(i1) || length(i2)) {
+ xi <- x$id
+ xp <- x$parent
+ n1 <- rep_len("4.1.0", length(i1))
+ ## Detect experimental placeholder feature as the head of a
+ ## chain of extractions by looking at the first child of the
+ ## grandparent of the placeholder: if it is the placeholder
+ ## expression then we have the 4.3.0 syntax.
+ n2 <- ifelse(vapply(i2,
+ function(j) {
+ u <- xp[j]
+ v <- xp[xi %in% u]
+ min(xi[xp %in% v]) == u
+ },
+ NA),
+ "4.3.0",
+ "4.2.0")
+ i <- c(i1, i2)
+ data.frame(token = x$token[i],
+ needs = c(n1, n2),
+ text = utils::getParseText(x, xp[i]))
+ } else
+ NULL
+}
+
### ** .package_code_using_R_4.x_syntax
.package_code_using_R_4.x_syntax <-
@@ -2109,43 +2141,31 @@
function(dir)
{
dir <- file_path_as_absolute(dir)
- wrk <- function(f) {
- p <- file.path(dir, "R", f)
- x <- utils::getParseData(parse(p, keep.source = TRUE))
- i1 <- which(x$token %in% c("PIPE", "'\\\\'"))
- i2 <- which(x$token == "PLACEHOLDER")
- if(length(i1) || length(i2)) {
- xi <- x$id
- xp <- x$parent
- n1 <- rep_len("4.1.0", length(i1))
- ## Detect experimental placeholder feature as the head of a
- ## chain of extractions by looking at the first child of the
- ## grandparent of the placeholder: if it is the placeholder
- ## expression then we have the 4.3.0 syntax.
- n2 <- ifelse(vapply(i2,
- function(j) {
- u <- xp[j]
- v <- xp[xi %in% u]
- min(xi[xp %in% v]) == u
- },
- NA),
- "4.3.0",
- "4.2.0")
- i <- c(i1, i2)
- data.frame(token = x$token[i],
- needs = c(n1, n2),
- text = utils::getParseText(x, xp[i]),
- file = rep_len(f, length(i)))
- } else
- NULL
+ wrk.R <- function(f)
+ {
+ ret <- .source_file_using_R_4.x_syntax(file.path(dir, "R", f))
+ if (!is.null(ret)) cbind(ret, file = f)
}
- one <- function(f)
- tryCatch(wrk(f), error = function(e) NULL)
-
- files <- list_files_with_type(file.path(dir, "R"), "code",
+ one.R <- function(f)
+ tryCatch(wrk.R(f), error = function(e) NULL)
+ files.R <- list_files_with_type(file.path(dir, "R"), "code",
full.names = FALSE,
OS_subdirs = c("unix", "windows"))
- do.call(rbind, lapply(files, one))
+
+ db <- Rd_db(dir = dir)
+ wrk.Rd <- function(Rd, f)
+ {
+ exfile <- tempfile()
+ on.exit(unlink(exfile))
+ Rd2ex(Rd, exfile)
+ ret <- .source_file_using_R_4.x_syntax(exfile)
+ if (!is.null(ret)) cbind(ret, file = f)
+ }
+ one.Rd <- function(Rd, f)
+ tryCatch(wrk.Rd(Rd, f), error = function(e) NULL)
+
+ do.call(rbind, c(lapply(files.R, one.R),
+ Map(one.Rd, db, names(db))))
}
## ** .package_depends_on_R_at_least
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel