This question links to this SO answer except that here I want to use the variable specified as function arg in a mutate_()
. It works if I don\'t make any \"calc
You have to use lazy evaluation (with the package lazyeval
), for example like this:
library(lazyeval)
func2 <- function(df, varname){
df %>%
mutate_(v3=interp(~sum(x), x = as.name(varname)))
}
func2(data, "v1")
# v1 v2 v3
#1 1 3 3
#2 2 4 3
With the devel version of dplyr
(0.5.0
) or in the new version (0.6.0
- awaiting release in April 2017), this can be done using slightly different syntax
library(dplyr)
funcN <- function(dat, varname){
expr <- enquo(varname)
dat %>%
mutate(v3 = sum(!!expr))
#or
#mutate(v3 = sum(UQ(expr)))
}
funcN(data, v1)
# v1 v2 v3
#1 1 3 3
#2 2 4 3
Here, enquo
takes the arguments and returns the value as a quosure
(similar to substitute
in base R
) by evaluating the function arguments lazily and inside the summarise
, we ask it to unquote
(!!
or UQ
) so that it gets evaluated.