En R data.table, ¿cómo paso los parámetros variables a una expresión?

Estoy atascado con un pequeño problema R con data.table . Su ayuda es muy apreciada. Cómo hago esto:

 getResult <- function(dt, expr, gby) { e <- substitute(expr) b <- substitute(gby) return(dt[,eval(e),by=b]) } v1 <- "Sepal.Length" v2 <- "Species" dt <- data.table(iris) rDT <- getResult(dt, sum(v1, na.rm=TRUE), v2) 

Me aparece el siguiente error:

Error en sum (v1, na.rm = TRUE): ‘tipo’ (carácter) inválido de argumento

Ahora, tanto v1 como v2 pasan de otro progtwig como variable de carácter, por lo que no puedo hacer esto v1<- quote(Sepal.Length) que parece funcionar.

Una alternativa a la respuesta de Flodel en los comentarios podría ser

 e <- parse(text = paste0("sum(", v1, ", na.rm = TRUE)")) b <- parse(text = v2) rDT2 <- dt[, eval(e), by = eval(b)] # b V1 # [1,] setosa 250.3 # [2,] versicolor 296.8 # [3,] virginica 329.4 

EDITAR:

Y para poner esto en una función,

 getResult <- function(dt, expr, gby){ return(dt[, eval(expr), by = eval(gby)]) } (dtR <- getResult(dt = dt, expr = e, gby = b)) # gives the same result as above 

EDIT de Matthew: Hay una razón sutil por la cual los paste0 y eval \ quote pueden ser más rápidos que los get en algunos casos también. Una de las razones por las que la agrupación puede ser rápida es que data.table inspeccione j para ver qué columnas utiliza, y luego solo subconjuntos de esas columnas usadas (preguntas más frecuentes 1.12 y 3.1). Utiliza base::all.vars(j) para hacer eso. Cuando se utiliza get() en j la columna que se utiliza está oculta de all.vars y data.table vuelve a subdividir todas las columnas por si la expresión j necesita (como cuando se .SD símbolo .SD en j , para qué .SDcols se agregó para resolverlo). Si todas las columnas se usan de todos modos, entonces no hay diferencia, pero si DT es decir 1e7x100, entonces una j=sum(V1) sumda j=sum(V1) debe ser mucho más rápida que una j=sum(get("V1")) para esa razón. Al menos, eso es lo que se supone que debe suceder, y si no es así, puede ser un error. Si, por otro lado, muchas consultas se construyen dinámicamente y se repiten, entonces el tiempo para paste0 y parse podría entrar en él. Todo depende realmente. El ajuste verbose=TRUE debe imprimir un mensaje sobre qué columnas se han detectado como j , para que se puedan verificar.