Mam funkcję, która zwraca dwie wartości na liście. Obie wartości należy dodać do tabeli data.table w dwóch nowych kolumnach. Ocena funkcji jest kosztowna, więc chciałbym uniknąć konieczności obliczania funkcji dwukrotnie. Oto przykład:Dodaj wiele kolumn do R data.tabeli w jednym wywołaniu funkcji?
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
Oto przykład mojej funkcji. Pamiętam, że powiedział to kosztowne obliczeniowej, na górze, że nie ma sposobu, aby wydedukować jedną wartość powrocie z innych podanych wartości (jak w poniższym przykładzie):
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
Oto mój sposób na dodanie dwóch kolumn w jednej instrukcji . Trzeba jednak dwukrotnie zadzwonić do myfun:
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41
2: a 3 42 45 -39
3: a 6 42 48 -36
4: b 1 4 5 -3
5: b 3 5 8 -2
6: b 6 6 12 0
7: c 1 7 8 -6
8: c 3 8 11 -5
9: c 6 9 15 -3
Jakieś sugestie, jak to zrobić? Mogę zapisać r2
w oddzielnym środowisku za każdym razem, gdy zadzwonię do myfun, po prostu potrzebuję sposobu na dodanie dwóch kolumn przez odniesienie na raz.
Dlaczego Twoja funkcja nie przyjmuje ramki danych i nie zwraca bezpośrednio ramki danych? 'Myfun <- funkcję (r, t) { ret1 = Y + V ret2 = y - v zwrotny (lista (R1 = ret1 r2 = ret2)) } –
@Etienne Bo kopiuje wejścia do tworzenia nowe wyjście. Florian używa 'data.table' dla swojej wydajności pamięci z dużymi zestawami danych; nie kopiuje w ogóle 'x',' y' lub 'v', nawet jeden raz. Pomyśl o zbiorach danych 20 GB w pamięci RAM. –