某些J表达式保留列名,而有些则不:
library(data.table)
d = data.table(hello = 1)
d[, .(hello)]
# hello
# 1: 1
d[, c(.(hello))]
# V1
# 1: 1
d[, {.(hello)}]
# hello
# 1: 1
d[, {1; .(hello)}]
# V1
# 1: 1
d[, .(get("hello"))]
# V1
# 1: 1
d[, mget("hello")]
# hello
# 1: 1
d[, c(mget("hello"))]
# Error: value for ‘hello’ not found # WTF?
d[, {1; mget("hello")}]
# hello
# 1: 1
一般规则是什么?
答案 0 :(得分:6)
这确实不是很神秘。首先请注意,.
是list
中data.table
的简写。考虑到这一点,这就是正在发生的事情。
除了mget
会吐出一个命名列表之外,您拥有的每个单个表达式都会生成一个未命名列表或向量。这就是mget
示例命名结果的原因。在所有其他示例中,data.table
仅以非常简单的表达式来推导名称,该表达式等效于list(items)
。在另外几种情况下,您会得到涉及.SD
的名称推论,但总的来说-如果您不命名(如mget
那样),并且比{{1 }},那么不要指望名字的减少。