Using the pipe, |>, syntax with "names<-"
Bert, You need to consider LHS vs RHS functionality. Before I start, I would have done your example setup lie this: trio <- 1:3 z <- data.frame(a = trio, b = letters[trio]) Just kidding! Syntactic sugar means you are calling this function:
`names<-`
function (x, value) .Primitive("names<-")
Not particularly documented is a gimmick I just tried of supplying a second argument to the more routine function version:
`names<-`(z, c("one","two"))
one two
1 1 a
2 2 b
3 3 c
The above does not change z, but returns a new DF with new names.
In a pipeline, try this:
z <-
z |>
`names<-`( c("one","two"))
z
a b 1 1 a 2 2 b 3 3 c
z <-
+ z |>
+ `names<-`( c("one","two"))
z
one two 1 1 a 2 2 b 3 3 c -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Bert Gunter Sent: Saturday, July 20, 2024 4:47 PM To: R-help <R-help at r-project.org> Subject: Re: [R] Using the pipe, |>, syntax with "names<-" With further fooling around, I realized that explicitly assigning my last "solution" 'works'; i.e. names(z)[2] <- "foo" can be piped as: z <- z |>(\(x) "names<-"(x,value = "[<-"(names(x),2,'foo')))()
z
a foo 1 1 a 2 2 b 3 3 c This is even awfuller than before. So my query still stands. -- Bert
On Sat, Jul 20, 2024 at 1:14?PM Bert Gunter <bgunter.4567 at gmail.com> wrote:
Nope, I still got it wrong: None of my approaches work. :( So my query remains: how to do it via piping with |> ? Bert On Sat, Jul 20, 2024 at 1:06?PM Bert Gunter <bgunter.4567 at gmail.com> wrote:
This post is likely pretty useless; it is motivated by a recent post from "Val" that was elegantly answered using Tidyverse constructs, but I wondered how to do it using base R only. Along the way, I ran into the following question to which I think my answer (below) is pretty awful. I would be interested in more elegant base R approaches. So... z <- data.frame(a = 1:3, b = letters[1:3])
z
a h 1 1 a 2 2 b 3 3 c Suppose I want to change the name of the second column of z from 'b' to 'foo' . This is very easy using nested function syntax by: names(z)[2] <- "foo"
z
a foo 1 1 a 2 2 b 3 3 c Now suppose I wanted to do this using |> syntax, along the lines of: z |> names()[2] <- "foo" ## throws an error Slightly fancier is: z |> (\(x)names(x)[2] <- "b")() ## does nothing, but does not throw an error. However, the following, which resulted from a more careful read of ?names works (after changing the name of the second column back to "b" of course): z |>(\(x) "names<-"(x,value = "[<-"(names(x),2,'foo')))()
z
a foo 1 1 a 2 2 b 3 3 c This qualifies to me as "pretty awful." I'm sure there are better ways to do this using pipe syntax, so I would appreciate any better approaches. Best, Bert
______________________________________________ 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.