Ivan Krylov
2025-Jan-16  11:41 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
Hello R-devel,
Approximately [*] the following CRAN packages make use of the pipe
syntax in their source code or examples without depending on R >= 4.1:
 [1] "biplotEZ"           "CaseBasedReasoning"
"collinear"
 [4] "cubble"             "disk.frame"        
"duckdbfs"
 [7] "eia"                "feltr"             
"flattabler"
[10] "geodimension"       "hgnc"              
"himach"
[13] "lay"                "lidR"              
"locateip"
[16] "particles"          "photosynthesis"    
"pivotea"
[19] "planr"              "rtrek"             
"satres"
[22] "sdtmval"            "selenider"         
"sewage"
[25] "stminsights"        "tabr"              
"tidygraph"
[28] "tidywikidatar"      "USgas"             
"washi"
[31] "zctaCrosswalk"
Since we have checks in place to automatically set Depends: R (>2.10.0) for
data files compressed with xz or bzip2 and >= 3.5.0 for
data files serialized with format version 3, would it make sense to
automatically add Depends: R (>= 4.1) for such packages?
The patch at the end of this message adds the R version dependency
during R CMD build:
R-devel CMD build --no-build-vignettes .
* checking for file ?./DESCRIPTION? ... OK
* preparing ?biplotEZ?:
* checking DESCRIPTION meta-information ... OK
* cleaning src
* checking vignette meta-information ... OK
* checking for LF line-endings in source and make files and shell
scripts
* checking for empty or unneeded directories
  NB: this package now depends on R (>= 4.1.0)
  WARNING: Added dependency on R >= 4.1.0 because some of the source
  files use the new syntax constructs.
Files making use of R >= 4.1 pipe |> or function shorthand \(...):
  biplotEZ/R/biplot.R biplotEZ/R/translate_axes.R
* building ?biplotEZ_2.2.tar.gz?
A more extensive test could also look at the tests, demos, and
\examples{}, but that may take longer and open the door for false
positives. A package that uses |> in one example would still be useful
on R-4.0.0, while a package that uses |> in the source code would fail
to parse and install.
Index: src/library/tools/R/QC.R
==================================================================---
src/library/tools/R/QC.R	(revision 87545)
+++ src/library/tools/R/QC.R	(working copy)
@@ -10367,7 +10367,29 @@
     }
 }
 
+.check_use_of_R41_syntax <-
+function(files)
+{
+    out <- vapply(files,
+           function(f) tryCatch(
+               any(getParseData(parse(f, keep.source = TRUE))$token %in%
c("PIPE", "'\\\\'")),
+               error = function(e) FALSE
+           ),
+           FALSE)
+    out <- files[out]
+    class(out) <- "check_use_of_R41_syntax"
+    out
+}
 
+format.check_use_of_R41_syntax <-
+function(x, ...)
+{
+    if (length(x)) {
+        c("Files making use of R >= 4.1 pipe |> or function
shorthand \\(...):",
+          .strwrap22(x, " "))
+    } else character()
+}
+
 ### Local variables: ***
 ### mode: outline-minor ***
 ### outline-regexp: "### [*]+" ***
Index: src/library/tools/R/build.R
==================================================================---
src/library/tools/R/build.R	(revision 87545)
+++ src/library/tools/R/build.R	(working copy)
@@ -1165,9 +1165,11 @@
         desc <- .read_description(file.path(pkgname,
"DESCRIPTION"))
         Rdeps <- .split_description(desc)$Rdepends2
         hasDep350 <- FALSE
+        hasDep410 <- FALSE
         for(dep in Rdeps) {
             if(dep$op != '>=') next
             if(dep$version >= "3.5.0") hasDep350 <- TRUE
+            if(dep$version >= "4.1.0") hasDep410 <- TRUE
         }
         if (!hasDep350) {
             ## re-read files after exclusions have been applied
@@ -1189,6 +1191,23 @@
                          "\n")
             }
         }
+        if (!hasDep410) {
+            uses410 <- .check_use_of_R41_syntax(dir(file.path(pkgname,
"R"),
+                                                    full.names = TRUE,
+                                                    pattern =
"[.]R$",
+                                                    ignore.case = TRUE))
+            if (length(uses410)) {
+                fixup_R_dep(pkgname, "4.1.0")
+                msg <- paste("WARNING: Added dependency on R >=
4.1.0 because",
+                             "some of the source files use the new
syntax",
+                             "constructs.")
+                printLog(Log,
+                         paste(c(strwrap(msg, indent = 2L, exdent = 2L),
+                                 format(uses410)),
+                               collapse = "\n"),
+                               "\n")
+            }
+        }
 
 	## add NAMESPACE if the author didn't write one
 	if(!file.exists(namespace <- file.path(pkgname, "NAMESPACE")) ) {
-- 
Best regards,
Ivan
[*] Based on the following GitHub search, which requires logging in:
https://github.com/search?q=org%3Acran%20path%3A%2F%5B.%5D%5BRr%5Dd%3F%24%2F%20%2F%5Cs%5C%7C%3E%2F&type=code
There's currently no REST API support for regexp search, so the list
was obtained manually.
Henrik Bengtsson
2025-Jan-16  15:22 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
Thanks for looking into this and the patch. FWIW, there's an open PR18105 - "R CMD build: Add dependency on R >= 4.1.0 if code uses pipe symbol |>" for this (https://bugs.r-project.org/show_bug.cgi?id=18105). /Henrik On Thu, Jan 16, 2025 at 3:42?AM Ivan Krylov via R-devel <r-devel at r-project.org> wrote:> > Hello R-devel, > > Approximately [*] the following CRAN packages make use of the pipe > syntax in their source code or examples without depending on R >= 4.1: > > [1] "biplotEZ" "CaseBasedReasoning" "collinear" > [4] "cubble" "disk.frame" "duckdbfs" > [7] "eia" "feltr" "flattabler" > [10] "geodimension" "hgnc" "himach" > [13] "lay" "lidR" "locateip" > [16] "particles" "photosynthesis" "pivotea" > [19] "planr" "rtrek" "satres" > [22] "sdtmval" "selenider" "sewage" > [25] "stminsights" "tabr" "tidygraph" > [28] "tidywikidatar" "USgas" "washi" > [31] "zctaCrosswalk" > > Since we have checks in place to automatically set Depends: R (>> 2.10.0) for data files compressed with xz or bzip2 and >= 3.5.0 for > data files serialized with format version 3, would it make sense to > automatically add Depends: R (>= 4.1) for such packages? > > The patch at the end of this message adds the R version dependency > during R CMD build: > > R-devel CMD build --no-build-vignettes . > * checking for file ?./DESCRIPTION? ... OK > * preparing ?biplotEZ?: > * checking DESCRIPTION meta-information ... OK > * cleaning src > * checking vignette meta-information ... OK > * checking for LF line-endings in source and make files and shell > scripts > * checking for empty or unneeded directories > NB: this package now depends on R (>= 4.1.0) > WARNING: Added dependency on R >= 4.1.0 because some of the source > files use the new syntax constructs. > Files making use of R >= 4.1 pipe |> or function shorthand \(...): > biplotEZ/R/biplot.R biplotEZ/R/translate_axes.R > * building ?biplotEZ_2.2.tar.gz? > > A more extensive test could also look at the tests, demos, and > \examples{}, but that may take longer and open the door for false > positives. A package that uses |> in one example would still be useful > on R-4.0.0, while a package that uses |> in the source code would fail > to parse and install. > > Index: src/library/tools/R/QC.R > ==================================================================> --- src/library/tools/R/QC.R (revision 87545) > +++ src/library/tools/R/QC.R (working copy) > @@ -10367,7 +10367,29 @@ > } > } > > +.check_use_of_R41_syntax <- > +function(files) > +{ > + out <- vapply(files, > + function(f) tryCatch( > + any(getParseData(parse(f, keep.source = TRUE))$token %in% c("PIPE", "'\\\\'")), > + error = function(e) FALSE > + ), > + FALSE) > + out <- files[out] > + class(out) <- "check_use_of_R41_syntax" > + out > +} > > +format.check_use_of_R41_syntax <- > +function(x, ...) > +{ > + if (length(x)) { > + c("Files making use of R >= 4.1 pipe |> or function shorthand \\(...):", > + .strwrap22(x, " ")) > + } else character() > +} > + > ### Local variables: *** > ### mode: outline-minor *** > ### outline-regexp: "### [*]+" *** > Index: src/library/tools/R/build.R > ==================================================================> --- src/library/tools/R/build.R (revision 87545) > +++ src/library/tools/R/build.R (working copy) > @@ -1165,9 +1165,11 @@ > desc <- .read_description(file.path(pkgname, "DESCRIPTION")) > Rdeps <- .split_description(desc)$Rdepends2 > hasDep350 <- FALSE > + hasDep410 <- FALSE > for(dep in Rdeps) { > if(dep$op != '>=') next > if(dep$version >= "3.5.0") hasDep350 <- TRUE > + if(dep$version >= "4.1.0") hasDep410 <- TRUE > } > if (!hasDep350) { > ## re-read files after exclusions have been applied > @@ -1189,6 +1191,23 @@ > "\n") > } > } > + if (!hasDep410) { > + uses410 <- .check_use_of_R41_syntax(dir(file.path(pkgname, "R"), > + full.names = TRUE, > + pattern = "[.]R$", > + ignore.case = TRUE)) > + if (length(uses410)) { > + fixup_R_dep(pkgname, "4.1.0") > + msg <- paste("WARNING: Added dependency on R >= 4.1.0 because", > + "some of the source files use the new syntax", > + "constructs.") > + printLog(Log, > + paste(c(strwrap(msg, indent = 2L, exdent = 2L), > + format(uses410)), > + collapse = "\n"), > + "\n") > + } > + } > > ## add NAMESPACE if the author didn't write one > if(!file.exists(namespace <- file.path(pkgname, "NAMESPACE")) ) { > > > -- > Best regards, > Ivan > > [*] Based on the following GitHub search, which requires logging in: > https://github.com/search?q=org%3Acran%20path%3A%2F%5B.%5D%5BRr%5Dd%3F%24%2F%20%2F%5Cs%5C%7C%3E%2F&type=code > There's currently no REST API support for regexp search, so the list > was obtained manually. > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Maybe Matching Threads
- Depends: R (>= 4.1) for packages that use |> and \(...)
- Depends: R (>= 4.1) for packages that use |> and \(...)
- Depends: R (>= 4.1) for packages that use |> and \(...)
- Depends: R (>= 4.1) for packages that use |> and \(...)
- Depends: R (>= 4.1) for packages that use |> and \(...)