Skip to content
Back to formatted view

Raw Message

Message-ID: <CADfFDC7khmCsd=8AcpnKQ=JwwJfEnJxwHJ=F3QQ=CZ=ruJ0Cyw@mail.gmail.com>
Date: 2024-07-21T05:07:57Z
From: Deepayan Sarkar
Subject: [External] Using the pipe, |>, syntax with "names<-"
In-Reply-To: <CAGxFJbR9ZG3n_QL8S51phVD0wAbj4Cko0xc1c0S6EqUtiJ4-KA@mail.gmail.com>

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]]