To jest z obserwacji podczas odpowiadania na to pytanie z @sds here.zrozumienie komunikatów optymalizacji przydziału przez odniesienie w data.table
Po pierwsze, niech mi przełącznik na wiadomości śladowych dla data.table
:
options(datatable.verbose = TRUE)
dt <- data.table(a = c(rep(3, 5), rep(4, 5)), b=1:10, c=11:20, d=21:30, key="a")
Teraz załóżmy, że ktoś chce dostać sumę wszystkich kolumn zgrupowane według kolumny a
, wtedy moglibyśmy zrobić:
dt.out <- dt[, lapply(.SD, sum), by = a]
Załóżmy teraz, że chciałbym dodać również liczbę wpisów należących do każdej grupy do dt.out
, a następnie zwykle przypisuję ją przez odwołanie w następujący sposób:
dt.out[, count := dt[, .N, by=a][, N]]
# or alternatively
dt.out[, count := dt[, .N, by=a][["N"]]]
W tym zadaniu przez odniesienie, jeden z komunikatów data.table
produkuje to:
RHS for item 1 has been duplicated. Either NAMED vector or recycled list RHS.
To jest wiadomość z pliku w katalogu źródłowym data.table za assign.C
. Nie chcę wklejać odpowiedniego fragmentu tutaj, ponieważ ma on około 18 linii. Jeśli to konieczne, po prostu zostaw komentarz, a wkleję kod. dt[, .N, by=a][["N"]]
po prostu daje [1] 5 5
. Tak więc jest to , a nie a named vector
. A ja nie rozumiem, co to recycled list
w RHS jest ..
Ale jeśli to zrobię:
dt.out[, `:=`(count = dt[, .N, by=a][, N])]
# or equivalently
dt.out[, `:=`(count = dt[, .N, by=a][["N"]])]
Potem dostaję komunikat:
Direct plonk of unnamed RHS, no copy.
Jak rozumiem tego, RHS został powielony w pierwszym przypadku, co oznacza, że robi kopię (płytkie/głębokie, to nie wiem). Jeśli tak, dlaczego tak się dzieje?
Nawet jeśli nie, dlaczego zmiany przypisania przez odniesienie między dwoma wewnętrznie? Jakieś pomysły?
Aby wydobyć główny podstawowej pytanie, które miałem w głowie podczas pisania tego postu (i zdają się zapominać!): Czy to „mniej skuteczny” przypisać jako dt.out[, count := dt[, .N, by=a][["N"]]]
(w porównaniu do drugiego sposobu prowadzenia to)?
Z przyjemnością odpowiadam, ale jakie są pytania w S.O. sens? Na razie odpowiem na pierwszą część ... –
Będę edytować pytanie, aby upewnić się, że moje pytanie, oprócz tych tutaj, jest * nieefektywne * do przypisania przy użyciu 'a: =. '. – Arun
U góry jestem raczej pewien, że powinny to być 'options (datatable.verbose = TRUE)'. Nie ma opcji "datatable.warnings", ale nic nie narzekałoby, że ustawienie było nieskuteczne. –