Ответ 1
Используйте это вместо:
DT[(bmask), .(out=number)]
# out
# 1: 2
# 2: 4
Роль скобок заключается в том, чтобы помещать символ bmask
внутри вызова функции, из среды оценки которого столбцы DT
будут видны 1. Любой другой вызов функции, который просто возвращает значение bmask
(например, c(bmask)
, I(bmask)
или bmask==TRUE
) или индексы его истинных элементов (например, which(bmask)
), будет работать так же хорошо, но может занять немного больше времени вычислить.
Если bmask
не находится внутри вызова функции, он будет искать в области вызова (здесь глобальная среда), что также может быть полезно иногда. Здесь соответствующее объяснение от ?data.table
:
Дополнительно: когда "i" - это одно имя переменной, это не считается выражением имен столбцов и вместо этого оценивается в области вызова.
1 Чтобы увидеть, что ()
сам является вызовом функции, введите is(`(`)
.