[R] Using the pipe, |>, syntax with "names<-"

Iris Simmons |kw@|mmo @end|ng |rom gm@||@com
Sun Jul 21 00:02:45 CEST 2024


It should be written more like this:

```R
z <- data.frame(a = 1:3, b = letters[1:3])
z |> names() |> _[2] <- "foo"
z
```

Regards,
    Iris

On Sat, Jul 20, 2024 at 4:47 PM Bert Gunter <bgunter.4567 using gmail.com> wrote:
>
> 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