[R] Using the pipe, |>, syntax with "names<-"
@vi@e@gross m@iii@g oii gm@ii@com
@vi@e@gross m@iii@g oii gm@ii@com
Sun Jul 21 00:07:12 CEST 2024
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 using r-project.org> On Behalf Of Bert Gunter
Sent: Saturday, July 20, 2024 4:47 PM
To: R-help <R-help using 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 using 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 using 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 using 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.
More information about the R-help
mailing list