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]`中自动打印出键(key)列?
更新(根据下面的答案和评论):感谢@Arun等人,我现在理解了设计原因。以上的原因是因为每次通过`X[Y]`语法进行`data.table`合并时,都会有一个隐藏的`by`,而该`by`是按键分组的。之所以设计成这样似乎是出于以下原因——由于在合并时必须执行`by`操作,因此如果要按合并的键执行`by`,那么可以利用这一点,而不必再执行另一个`by`。
话虽如此,我认为这是语法设计上的缺陷。我读取`data.table`语法`d[i, j, by=b]`的方式是
取`d`,应用`i`操作(无论是子集还是合并或其他操作),然后按`b`执行`j`表达式"by"
没有按照`by`执行`by`会导致这种读法无效,并引入需要特别考虑的情况(我是否在合并`i`,`by`是否只是合并的键等)。我认为这应该是`data.table`的任务——为了使`data.table`在合并的一种特定情况下更快,即`by`等于键的情况下,应该以另一种方式实现(例如,通过在内部检查`by`表达式是否实际上是合并的键)。
d[J(3), value := 10]
的效果如预期。 - eddifancy_sum(x, y)
,它会计算x
和y
的和,除非x
等于 10,此时它会执行乘法。想象一下这也是文档化的行为,称为 product-instead-of-sum。虽然这是一个文档化的 语法设计选择,但我认为这是一个明显的 语法设计缺陷。 - eddi