1

Consider

library(dplyr)
assign_rhs <- function(df, rhs) {
  df %>%
    mutate(lhs = {{rhs}})
}

a = data.frame(b = 1, c = 2)

assign_rhs(a, b)

will yields:

  b c lhs
1 1 2   1

and I can do assign_rhs(a, c) as well to assign lhs to c instead of b.

How do I do it so that the lhs can also receive the NSE {{}} treatment provided by {rlang}?

I tried

library(dplyr)
assign_lhs_rhs <- function(df, lhs, rhs) {
  df %>%
    mutate({{lhs}} = {{rhs}})
}

a = data.frame(b = 1, c = 2)

assign_lhs_rhs(lhs, b)

but I get error when defining the function

Error: unexpected '=' in:
"  df %>%
    mutate({{lhs}} ="
xiaodai
  • 14,889
  • 18
  • 76
  • 140

1 Answers1

4

If you use := instead of = you can use NSE on the left-hand side of the assignment:

assign_lhs_rhs <- function(df, lhs, rhs) {
    df %>%
        mutate({{lhs}} := {{rhs}})
}

a = data.frame(b = 1, c = 2)

assign_lhs_rhs(a, out, b)

Output:

  b c out
1 1 2   1

I'm not an expert on non-standard evaluation, but as far as I know the reason for this is that it's not possible to override the way = works, so it has to be done via a new operator :=.

Marius
  • 58,213
  • 16
  • 107
  • 105