[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)

Kurt Hornik Kurt@Horn|k @end|ng |rom wu@@c@@t
Sun Jan 19 17:38:36 CET 2025


>>>>> Kurt Hornik writes:

Oh dear.  Using a variant of Ivan's code, I seem to find 728 (!!!) CRAN
packages which are missing their R >= 4.1 dependency.

So clearly we need to do more about this than teach R CMD build to add
the dependency ...

Best
-k

>>>>> Henrik Bengtsson writes:
> Thanks.  Will take a look ...

> Best
> -k

>> 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 using 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 using r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel

>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel

> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list