Kurt Hornik
2025-Jan-17 14:29 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
>>>>> 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 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> ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Kurt Hornik
2025-Jan-19 16:38 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
>>>>> 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 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>> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel> ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Apparently Analagous 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 \(...)