Why is using list() critical for .dots = setNames() uses in dplyr?

Viewed 2870

I am calling mutate using dynamic variable names. An example that mostly works is:

df <- data.frame(a = 1:5, b = 1:5)
func <- function(a,b){
  return(a+b)
}
var1 = 'a'
var2 = 'b'
expr <- interp(~func(x, y), x = as.name(var1), y = as.name(var2))
new_name <- "dynamically_created_name"
temp <- df %>% mutate_(.dots = setNames(expr, nm = new_name))

Which produces

temp
  a b func(a, b)
1 1 1          2
2 2 2          4
3 3 3          6
4 4 4          8
5 5 5         10

This is mostly fine except that set names ignored the nm key. This is solved by wrapping my function in list():

temp <- df %>% mutate_(.dots = setNames(list(expr), nm = new_name))
temp
  a b dynamically_created_name
1 1 1                        2
2 2 2                        4
3 3 3                        6
4 4 4                        8
5 5 5                       10

My question is why is setNames ignoring it's key in the first place, and how does list() solve this problem?

2 Answers
Related