>>>>> Kurt Hornik writes: I just committed c8761[2-4] to the trunk which adds an internal utility for finding package code using the pipe or function shorthand, teaches R CMD build to add a dependency on R >= 4.1.0 as necessary, and teaches R CMD check to NOTE a missing dependency on R >= 4.1.0, based on Ivan's code.
Currently, we seem to have about 1149 packages on CRAN with package code using the pipe or function shorthand, with only 415 depending on R >= 4.1.0, and 734 not. Argh. Thanks again for spotting this. Best -k >>>>> 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@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@r-project.org mailing list >>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel