Forcing dplyr to evaluate passed symbol / quosure when conflicting with existing column name

124 Views Asked by At

Problem

I want to string of a column name to dplyr::arrange in a form am <- "cyl". The purpose is to sort by column cyl.

Desired outcome

dplyr::arrange(mtcars, cyl)

Attempts

am <- "cyl"

1) rlang::quo

dplyr::arrange(mtcars, !!rlang::quo(am))

Sorted by am not cyl.

2) rang::ensym

dplyr::arrange(mtcars, !!rlang::ensym(am))

Sorted by am not cyl.

3) Culry Curly

dplyr::arrange(mtcars, {{am}})

Not sorted.


Background

In actual function I'm sorting data frame by index column I'm creating. The variable with column name is called index_column. I want protect myself from, albeit highly unlikely, scenario of actual data containing index_column. I could solve that using make.names and scanning for unique column names but I'm more interested in solving the problem above.

2

There are 2 best solutions below

0
akrun On BEST ANSWER

It would be sym

out2 <-  dplyr::arrange(mtcars, !!rlang::sym(am))

-testing with OP's expected

out1 <- dplyr::arrange(mtcars, cyl)
identical(out1, out2)
#[1] TRUE
0
Lionel Henry On

The recommended way is to use .data:

dplyr::arrange(mtcars, .data[[my_variable]])