Hi @cparsania. You question is a little complicated. I try my best to make it clear.
The !! is not for as_mapper, it is for mutate_if. It uses to trigger the evaluation of ..2 and ..3 in a quoted expression in non standard evaluation.
Why ..1 not need unquote because as_mapper is just like extract function. It map your function
~ (..1 %>% dplyr::mutate_if(is.numeric , ~ log(. + !!..2 ,base = !!..3) ))
to an only argument ellipsis ... with the arguments like this
function (..., .x = ..1, .y = ..2, . = ..1)
..1 means the first element in ellipsis. ..2 means the second element and so on. So, ..1 is evaluated as standard evaluation and no need unquote.
As the above, because all variables pass to the function as ellipsis. So, no matter what name you give to the argument, we can retrieve the value of the first element of ellipsis with ..1, the second element of ellipsis with ..2 and the third element of ellipsis with ..3.
P.S. You can also you .x and . to retrieve the first element of the ellipsis and .y for the second element.
Hope I can make myself clear and can help.