[External] Using the pipe, |>, syntax with "names<-"
I think that the simplicity of setNames is hard to beat:
z |> setNames( c( "a", "foo" ) )
and if you are determined not to load dplyr then
column_rename <- function( DF, map ) {
on <- names( DF )
on[ match( map, on ) ] <- names( map )
names( DF ) <- on
DF
}
is more robust to column reorganization than replace():
z |> column_rename( c( foo = "b" ) )
On July 20, 2024 10:07:57 PM PDT, Deepayan Sarkar <deepayan.sarkar at gmail.com> wrote:
The main challenge in Bert's original problem is that `[` and `[<-` cannot be called in a pipeline. The obvious solution is to define named versions, e.g.: elt <- `[` `elt<-` <- `[<-` Then,
z <- data.frame(a = 1:3, b = letters[1:3]) z |> names() |> elt(2)
[1] "b"
z |> names() |> elt(2) <- "foo" z
a foo 1 1 a 2 2 b 3 3 c You could actually also do (using a similar function already defined in methods) z |> names() |> el(2) <- "bar" Iris's _ trick is of course a nice alternative; and this example in ?pipeOp already covers it: # using the placeholder as the head of an extraction chain: mtcars |> subset(cyl == 4) |> lm(formula = mpg ~ disp) |> _$coef[[2]] While the replacement question is a nice exercise, I am not sure about the value of emphasizing that you can use pipes to do complex assignments. Doesn't that defeat the whole purpose of piping? For one thing, it will necessarily terminate the pipe. Also, it will not work if the starting value is not a variable. E.g.,
data.frame(a = 1:3, b = letters[1:3]) |> names() |> _[2] <- "bar"
Error in names(data.frame(a = 1:3, b = letters[1:3]))[2] <- "bar" : target of assignment expands to non-language object Duncan's rename() approach, which will just change the column name and return the modified object, seems more useful as part of a pipeline. Best, -Deepayan On Sun, 21 Jul 2024 at 04:46, Bert Gunter <bgunter.4567 at gmail.com> wrote:
I second Rich's excellent suggestion.
As with all elegant solutions, Iris's clicked on the wee light bulb in
my brain, and I realized that a slightly more verbose, but perhaps
more enlightening, alternative may be:
z |> attr("names") |> _[2] <- "foo"
However, I would add this as an example *only with* Iris's solution.
Hers should be shown whether or not the above is.
Cheers,
Bert
On Sat, Jul 20, 2024 at 3:35?PM Richard M. Heiberger <rmh at temple.edu>
wrote:
I think Iris's solution should be added to the help file: ?|> there are no examples there now that show assignment or replacement
using the "_"
On Jul 20, 2024, at 18:21, Duncan Murdoch <murdoch.duncan at gmail.com>
wrote:
On 2024-07-20 6:02 p.m., Iris Simmons wrote:
z <- data.frame(a = 1:3, b = letters[1:3]) z |> names() |> _[2] <- "foo" z
That's a great suggestion! Duncan Murdoch
______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide
http://www.r-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
[[alternative HTML version deleted]]
______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Sent from my phone. Please excuse my brevity.