Функция вывода в список data.tables по ссылке в автоматическом режиме - PullRequest
0 голосов
/ 22 января 2020

У меня есть список data.tables, и я хочу применить функцию к каждому data.table. Я настроен на использование := внутри функции lapply. Все работает отлично, и мои выводы обновляются по ссылке, но моя функция также печатает на консоль. Это часть гораздо более крупного проекта, и вывод этого шага на консоль не идеален.

Как выполнить это «без вывода сообщений» без печати? Есть ли лучший способ структурировать рабочий процесс / код?

dt1 <- data.table(a = rnorm(1:10),
           b = rnorm(1:10))

dt2 <- data.table(a = rnorm(1:10),
                  b = rnorm(1:10))

dts <- list(dt1, dt2)

lapply(dts, function(dt) {
  dt[, ':=' (c = a + b)]
})

dts

dts теперь имеет столбец C, но выходные данные отображались в консоли. Этот фрагмент кода вызывается из другой функции.

Ответы [ 4 ]

4 голосов
/ 22 января 2020

Вы можете использовать для l oop

for(dt in dts) dt[, ':='(c = a + b)]
2 голосов
/ 22 января 2020

Вы можете назначить вызов lapply, который подавит вывод

dts <- lapply(dts, function(dt) {
  dt[, ':=' (c = a + b)]
})
2 голосов
/ 22 января 2020

Мы. можно использовать walk, который ничего не печатает в консоль

library(purrr)
walk(dts, ~ .x[, `:=`(c = a + b)])
dts
#[[1]]
#             a          b            c
# 1: -0.1069952  0.1115983  0.004603111
# 2:  0.3228771 -0.8400846 -0.517207530
# 3: -1.6072728 -0.2727947 -1.880067477
# 4:  0.1715614 -0.3864995 -0.214938065
# 5:  1.8233350 -1.0786569  0.744678084
# 6:  0.2366026 -0.6166318 -0.380029253
# 7:  0.2373992  0.2251559  0.462555116
# 8: -0.1075611 -1.0418174 -1.149378504
# 9:  1.6742520 -0.5635583  1.110693774
#10:  2.4733842  2.1091365  4.582520731

#[[2]]
#             a           b           c
# 1: -0.8332617  1.67201117  0.83874947
# 2:  1.3688393  1.12168046  2.49051974
# 3:  1.0208642 -1.18482073 -0.16395650
# 4:  0.6784662  2.15979872  2.83826493
# 5: -0.4351644 -0.04629453 -0.48145894
# 6:  1.3133550 -1.03423308  0.27912197
# 7:  1.0143396 -0.84787780  0.16646185
# 8: -0.9622108  0.92338456 -0.03882627
# 9: -0.3106202  1.08886031  0.77824008
#10:  0.7602507 -0.08996701  0.67028370

Или обернуть с invisible вместе с lapply

invisible(lapply(dts, function(dt) {
                  dt[, ':=' (c = a + b)]
     }))
0 голосов
/ 23 января 2020

Использование набора:

for (i in seq_along(dts)) set(dts[[i]], j = "c", value = dts[[i]]$a + dts[[i]]$b)

...