Pakiet data.table
ma specjalną składnię, która wymaga użycia wyrażeń jako argumentów i
i j
.Jak napisać funkcję, która wywołuje funkcję, która wywołuje data.table?
Ma to pewien wpływ na to, w jaki sposób jedna funkcja zapisu przyjmuje i przekazuje argumenty do tabel danych, co jest bardzo dobrze wyjaśnione w section 1.16 of the FAQs.
Ale nie mogę wymyślić, jak wziąć ten dodatkowy poziom.
Oto przykład. Że chcę napisać funkcję otoki foo()
sprawia, że konkretne podsumowanie moich danych, a następnie drugie owinięcie plotfoo()
który wywołuje foo()
i działki wynik:
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
OK, to działa, bo dostać moje tabelaryczne wyników :
by N
1: 4 12
2: 3 15
3: 5 5
teraz staram się tak samo podczas pisania plotfoo()
ale nie zdało egzaminu:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)
Ale tym razem pojawia się komunikat o błędzie:
Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
OK, więc eval()
jest przyczyną problemu. Załóżmy, usuń go:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)
Och nie, mam nowy komunikat o błędzie:
Error in `[.data.table`(data, , .N, by = list(eval(by))) :
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]
A oto gdzie pozostanie zatrzymany.
Pytanie: Jak napisać funkcję, która wywołuje funkcję, która wywołuje data.table?
nie jest rozwiązaniem, ale jeśli usunąć 'substytut (by) 'i' eval' i przekazują 'gear' jako zmienną znakową, taką jak' foo (DT, "gear") 'następnie oba działają. – Arun