data.table究竟何时保留列名?

Kod*_*ist 6 r data.table

一些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
Run Code Online (Sandbox Code Playgroud)

一般规则是什么?

edd*_*ddi 7

这真的不是很神秘.首先要注意.是速记listdata.table.考虑到这一点,这就是正在发生的事情.

您拥有的每个单独的表达式都会生成一个未命名的列表或向量,除了mget它会吐出一个命名列表.这就是mget示例命名结果的原因.在所有其他示例中,data.table只使用非常简单的表达式推断出名称,这些表达式相当于list(items).还有一些案例,你会得到名称扣除.SD,但一般来说 - 如果你没有命名(如同mget)并且它比复杂list(items),那么不要指望名称扣除.

  • 看,`相同(quote({list("hello")}),quote(list("hello")))`是`FALSE`,而`{.(hello)}`将推断出名称,而`{ {.(你好)}}`不会.也许在未来它会,也许它不会.也许将来`{.(你好)}`也会停止演绎,并严格限制为`list` /`.`.无数次地重复自己 - 如果你担心不确定性,我只会看到这件事,并且有一个解决方案.除此之外,我没有看到这个问题的价值. (4认同)