Thanks for a great answer - I think you're right about the confusion being to do with the similarity of the names.
Edit: on second thoughts, I'm still a little confused as to the point of c_across - it doesn't seem to do anything that across() doesn't? Seems superfluous. Be great to see a situation where c_across does something unique that across() can't (as @riinu said in the first place!)
On my (off-topic) point about not using across() with a single variable,
@francisbarton You don't need across() when operating on a single variable.
I think it is needed. Look and compare:
library(dplyr, warn.conflicts = FALSE)
set.seed(42)
df <- tibble(id = 1:3, w = runif(3), x = runif(3))
df %>%
mutate(x, ~ `*`(., w))
#> Error: Problem with `mutate()` input `..2`.
#> x Input `..2` must be a vector, not a `formula` object.
#> i Input `..2` is `~. * w`.
df %>%
mutate_at(vars(x), ~ `*`(., w))
#> # A tibble: 3 x 3
#> id w x
#> <int> <dbl> <dbl>
#> 1 1 0.915 0.760
#> 2 2 0.937 0.601
#> 3 3 0.286 0.149
df %>%
mutate(across(x, ~ `*`(., w)))
#> # A tibble: 3 x 3
#> id w x
#> <int> <dbl> <dbl>
#> 1 1 0.915 0.760
#> 2 2 0.937 0.601
#> 3 3 0.286 0.149
df %>%
mutate(x = `*`(x, w))
#> # A tibble: 3 x 3
#> id w x
#> <int> <dbl> <dbl>
#> 1 1 0.915 0.760
#> 2 2 0.937 0.601
#> 3 3 0.286 0.149
Created on 2020-07-29 by the reprex package (v0.3.0)
Using a bare variable without across() in the first example leads to an error. It's a very minor thing but I think it would be neat to mutate a single variable by passing a function using the formula notation, without using across(). [In the same way that you only need to use c() to construct a vector if there's more than one item, otherwise just a bare element is fine.]
The last example with '=' is fine but I like the elegance of the formula notation.