Ivan Krylov
2025-Jan-23 09:10 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
Many thanks to Henrik for remembering the report in Bugzilla and to Kurt for implementing the change and finding out the true number of affected packages. On Wed, 22 Jan 2025 15:34:41 -0500 Ian Farm <ian.farm at maine.edu> wrote:> Would packages using the underscore placeholder with the native pipe > need to also depend on R >= 4.2.0?That's a good find! For the R >= 4.2 syntax, we only need to check for getParseData(...)$token %in% 'PLACEHOLDER'. The R >= 4.3 syntax feature is harder to test for:>> As an experimental feature the placeholder _ can now also be used in >> the rhs of a forward pipe |> expression as the first argument in an >> extraction call, such as _$coef. More generally, it can be used as >> the head of a chain of extractions, such as _$coef[[2]].I think it might be possible to parse(text = paste('PLACEHOLDER |>', grandparent_expression)) and then look at the top-level function in the call, but that feels quite fragile: x <- utils::getParseData(parse(f, keep.source = TRUE)) i <- x$token %in% "PLACEHOLDER" pi <- x[i, "parent"] ppi <- x[x$id %in% pi, "parent"] placeholder_expressions <- utils::getParseText(x, ppi) extractor_used <- vapply(placeholder_expressions, function(src) { toplevel <- parse(text = paste("PLACEHOLDER |> ", src))[[1]][[1]] identical(toplevel, quote(`$`)) || identical(toplevel, quote(`[`)) || identical(toplevel, quote(`[[`)) }, FALSE) Alternatively, we may find the first child of the grandparent of the placeholder. If it's the placeholder expression, then the pipe must be of the form ...|> _..., which is the R >= 4.3 syntax: x <- utils::getParseData(parse(f, keep.source = TRUE)) i <- x$token %in% "PLACEHOLDER" vapply(which(i), function(i) { pi <- x[i, "parent"] ppi <- x[x$id %in% pi, "parent"] cppi <- x[x$parent %in% ppi, "id"] min(cppi) == pi }, FALSE) -- Best regards, Ivan
Kurt Hornik
2025-Jan-23 10:16 UTC
[Rd] Depends: R (>= 4.1) for packages that use |> and \(...)
>>>>> Ivan Krylov via R-devel writes:Thanks. I am already looking handling the 4.2.0 placeholder syntax, but likely will need to refactor the code I added yesterday. The "experimental" 4.3.0 extra placeholder feature looks like a lot of effort: ideally there would be a simpler way. I'll ask on R Core. 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. Best -k> Many thanks to Henrik for remembering the report in Bugzilla and to > Kurt for implementing the change and finding out the true number of > affected packages.> On Wed, 22 Jan 2025 15:34:41 -0500 > Ian Farm <ian.farm at maine.edu> wrote:>> Would packages using the underscore placeholder with the native pipe >> need to also depend on R >= 4.2.0?> That's a good find! For the R >= 4.2 syntax, we only need to check for > getParseData(...)$token %in% 'PLACEHOLDER'. The R >= 4.3 syntax feature > is harder to test for:>>> As an experimental feature the placeholder _ can now also be used in >>> the rhs of a forward pipe |> expression as the first argument in an >>> extraction call, such as _$coef. More generally, it can be used as >>> the head of a chain of extractions, such as _$coef[[2]].> I think it might be possible to parse(text = paste('PLACEHOLDER |>', > grandparent_expression)) and then look at the top-level function in the > call, but that feels quite fragile:> x <- utils::getParseData(parse(f, keep.source = TRUE)) > i <- x$token %in% "PLACEHOLDER" > pi <- x[i, "parent"] > ppi <- x[x$id %in% pi, "parent"] > placeholder_expressions <- utils::getParseText(x, ppi) > extractor_used <- vapply(placeholder_expressions, function(src) { > toplevel <- parse(text = paste("PLACEHOLDER |> ", src))[[1]][[1]] > identical(toplevel, quote(`$`)) || > identical(toplevel, quote(`[`)) || > identical(toplevel, quote(`[[`)) > }, FALSE)> Alternatively, we may find the first child of the grandparent of the > placeholder. If it's the placeholder expression, then the pipe must be > of the form ...|> _..., which is the R >= 4.3 syntax:> x <- utils::getParseData(parse(f, keep.source = TRUE)) > i <- x$token %in% "PLACEHOLDER" > vapply(which(i), function(i) { > pi <- x[i, "parent"] > ppi <- x[x$id %in% pi, "parent"] > cppi <- x[x$parent %in% ppi, "id"] > min(cppi) == pi > }, FALSE)> -- > Best regards, > Ivan> ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel