В R 2.15.0 и data.table 1.8.9:
d = data.table(a = 1:5, value = 2:6, key = "a")
d[J(3), value]
#   a value
#   3     4
d[J(3)][, value]
#   4
Я ожидал, что оба будут производить тот же результат (второй), и я считаю, что они должны.
В интересах выяснения того, что это не проблема синтаксиса J, такое же ожидание относится к следующим (идентичным выше) выражениям:
t = data.table(a = 3, key = "a")
d[t, value]
d[t][, value]
Я бы ожидал, что оба из них вернут тот же результат.
  Итак, позвольте мне перефразировать вопрос - почему (data.table сконструирован так, чтобы) ключевой столбец автоматически распечатывался в d[t, value]?
  Обновление (на основе ответов и комментариев ниже): Спасибо @Arun и др., я понимаю дизайн - почему сейчас. Причина, по которой выше выдает ключ, заключается в том, что каждый раз, когда вы выполняете слияние data.table с помощью синтаксиса X[Y], существует скрытая информация, а by - ключ. Причина, по которой он сконструирован таким образом, выглядит следующим образом: поскольку операция by должна выполняться при слиянии, можно также воспользоваться этим и не делать другого by, если вы собираетесь сделать это с помощью ключа слияния.
Теперь, когда я сказал, я считаю, что недостаток дизайна синтаксиса. То, как я читаю синтаксис data.table d[i, j, by = b], это
возьмите
d, примените операциюi(будь то подмножество или слияние или что-то еще), а затем выполните выражениеJ"на" b
Пошаговое разрывы этого чтения и вводятся случаи, о которых нужно думать конкретно (я слияния на i, by просто ключ слияния и т.д.). Я считаю, что это должно быть задачей data.table - похвальное усилие сделать data.table быстрее в одном конкретном случае слияния, когда by равен ключу, должно выполняться альтернативным способом (например, путем проверки внутри, если выражение by фактически является ключом слияния).
