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

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Sat Jul 20 23:59:43 CEST 2024


I suspect that you would want to define a function which was aware of 
the limitations of piping to handle this.  For example:

rename <- function(x, col, newname) {
   names(x)[col] <- newname
   x
}

Then

z |> rename(2, "foo")

would be fine.

Duncan Murdoch

On 2024-07-20 4:46 p.m., Bert Gunter 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