Problem
The {{}}
operator from the rlang
package makes it incredibly easy to pass column names as function arguments (aka Quasiquotation). I understand rlang
is intended to work with tidyverse
, but is there a way to use {{}}
in data.table
?
Intended use of {{}} with dplyr
test_dplyr <- function(dt, col1, col2){
temp <- dt %>%
group_by( {{col2}} ) %>%
summarise(test = mean( {{col1}} ))
return(temp)
}
test_dplyr(dt=iris, col1=Sepal.Length, col2=Species)
> # A tibble: 3 x 2
> Species test
> <fct> <dbl>
> 1 setosa 5.01
> 2 versicolor 5.94
> 3 virginica 6.59
Failed attempt of using {{}} with data.table
This is ideally what I would like to do, but it returns an ERROR.
test_dt2 <- function(dt, col1, col2){
data.table::setDT(dt)
temp <- dt[, .( test = mean({{col1}})), by = {{col2}} ] )
return(temp)
}
# error
test_dt2(dt=iris, col1= Sepal.Length, col2= Species)
# and error
test_dt2(dt=iris, col1= 'Sepal.Length', col2= 'Species')
Alternative use of rlang with data.table
And here is an alternative way to use rlang
with data.table
. There are two inconvinences here, which are to rlang::ensym()
every column name variable, and having to call data.table operations inside rlang::injec()
.
test_dt <- function(dt, col1, col2){
# eval colnames
col1 <- rlang::ensym(col1)
col2 <- rlang::ensym(col2)
data.table::setDT(dt)
temp <- rlang::inject( dt[, .( test = mean(!!col1)), by = !!col2] )
return(temp)
}
test_dt(dt=iris, col1='Sepal.Length', col2='Species')
> Species test
> 1: setosa 5.006
> 2: versicolor 5.936
> 3: virginica 6.588