W danych R.table, jak przekazać zmienne parametry do wyrażenia?

Utknąłem z małym problemem R z data.table. Twoja pomoc jest bardzo doceniana. Jak to zrobić:

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)

Dostaję następujący błąd:

Błąd w sumie (v1, na.RM = TRUE): invalid ' type '(character) of argument

Teraz, zarówno v1 jak i v2 są przekazywane z innego programu jako zmienna znakowa, więc nie mogę tego zrobić v1<- quote(Sepal.Length), co wydaje się działać.

Author: user1157129, 2012-05-20

1 answers

Alternatywą dla odpowiedzi flodela w komentarzach może być

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

EDIT:

I umieścić to w funkcji,

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 from Mateusz: Jest subtelny powód, dla którego paste0 i eval \ quote metody mogą być szybsze niż get w niektórych przypadkach, zbyt. Jednym z powodów, dla których grupowanie może być szybkie jest to, że data.table sprawdza j, aby zobaczyć, których kolumn używa, a następnie tylko podzbiory tych używanych kolumn(FAQ 1.12 i 3.1). Używa do tego base::all.vars(j). Podczas używania get() w j używana kolumna jest ukryta przed all.vars i data.table wraca do podzestawu wszystkich kolumn na wypadek, gdyby wyrażenie j ich wymagało (podobnie jak gdy symbol .SD jest używany w j, dla którego {[16] } zostało dodane do rozwiązania). Jeśli wszystkie kolumny i tak są używane, to nie robi to różnicy, ale jeśli DT jest powiedzmy 1e7x100, to zgrupowane j=sum(V1) powinno być znacznie szybsze niż zgrupowane j=sum(get("V1")) z tego powodu. Przynajmniej tak powinno być, a jeśli to nie, to może być błąd. Jeśli z drugiej strony wiele zapytań jest budowanych dynamicznie i powtarzanych, wtedy może nadejść czas paste0 i parse. Wszystko zależy naprawdę. Ustawienie {[22] } powinno wyświetlać komunikat o tym, które kolumny zostały wykryte jako używane przez j, aby można było to sprawdzić.

 20
Author: BenBarnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-20 21:12:18