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ć.
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ć.
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