Иногда мне нравится (или приходится) делать цепочки при работе с таблицей данных.
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
DT[, .(y, z = v * y)][, lapply(.SD, sum)]
Однако я также могу написать последнюю строку, используя конвейер, что может быть полезным иногда (в отношении читабельности / структурирования кода):
DT[, .(y, z = v * y)] %>%
.[, lapply(.SD, sum)]
Является ли подход цепочки с использованием каналов эквивалентным построению цепочек без каналов в отношении производительности (скорости, использования памяти)?
РЕДАКТИРОВАТЬ: я в курсе в некоторых ситуациях связывание с использованием труб может быть медленнее, чем без труб. Но мой вопрос заключается в том, что если DT[...] %>% .[...]
вместо DT[...][...]
является таким примером (поскольку это может быть случай, когда в DT[...][...]
есть некоторая внутренняя «невидимая» оптимизация, которая будет нарушена в DT[...] %>% .[...])
.
EDIT2: Также я знаю, что использование канала всегда приводит к небольшим издержкам, которые могут иметь значение, если выполняется очень большое количество таких операций. Но меня интересует вопрос, который я попытался уточнить в вышеупомянутом редактировании с точки зрения алгоритма c (а именно, из-за возможности применения эффективной внутренней оптимизации из-за использования%>%).