【发布时间】:2013-04-12 04:16:22
【问题描述】:
在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 这样设计)key 列会自动打印在 d[t, value] 中?
更新(基于下面的答案和 cmets): 感谢@Arun 等人,我现在了解设计原因。上面打印 key 的原因是因为每次通过 X[Y] 语法进行 data.table 合并时都会出现一个隐藏的 by,而 by是关键。以这种方式设计的原因似乎如下 - 因为在合并时必须执行 by 操作,如果您打算通过密钥执行此操作,不妨利用这一点,而不是执行另一个 by合并。
话虽如此,我相信这是一个语法设计缺陷。我阅读data.table语法d[i, j, by = b]的方式是
取
d,应用i操作(是子集或合并等),然后执行j表达式“by”b
by-without-by 打破了这种阅读并介绍了一个必须特别考虑的案例(我是在 i 上合并,by 只是合并的关键,等等)。我相信这应该是data.table 的工作——当by 等于键时,在合并的一个特定情况下使data.table 更快的值得称赞的努力应该以另一种方式完成(例如通过内部检查 by 表达式是否实际上是合并的关键)。
【问题讨论】:
-
现在做了什么;同样,
d[J(3), value := 10]按预期工作 -
嗯?我不认为我们彼此了解。我认为(在这种情况下)
d[3, value]和d[J(3), value]应该产生相同的结果。 -
能否请您更改此问题的标题。这种行为是 100% 预期的,并且经常被利用。
-
@Arun 想象我写了一个函数
fancy_sum(x, y),它通常会计算x和y的总和,除非x等于10,在这种情况下它会相乘.想象一下,这也是记录在案的行为,称为 product-instead-of-sum。虽然有文档记录的语法设计选择,但我认为这是一个明显的语法设计缺陷。 -
@Arun,阅读 FR 底部的评论。如果这仍然没有得到重点,我不知道会怎样。你在谈论事情是如何工作的,以及为什么提供不同类别的输入会产生不同的结果,而我在谈论事情应该如何工作,以及不同类别的输入如何为这个休息时间产生不同的结果用户期望。
标签: r data.table