Из соображений полноты, вот ответ @nicola, размещенный в виде комментария под вопросом:
Выражение или цитата должны быть заключены в eval()
. Для примеров в вопросе это выглядит так:
library(data.table)
dt <- data.table(a = 1:10)
dt[a == 5,] # Everything well
dt[eval(quote(a == 5)),] # Now, it works
dt[eval(expression(a == 5)),] # Now, it works
Похоже, секрет в том, что R оценивает аргументы в среде функции, а не в контексте, в котором вызывается функция.