我们真的需要添加J()以选择数字列吗?
我们可以不用得到字符列的结果J().
library(data.table)
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
DT["a"]
# x y v
# 1: a 1 1
# 2: a 3 2
# 3: a 6 3
setkey(DT,y)
DT["1"]
# Error in `[.data.table`(DT, "1") :
# typeof x.y (double) != typeof i.y (character)
# Is it a bug?
DT[J(1)]
# y x v
# 1: 1 a 1
# 2: 1 b 4
# 3: 1 c 7
Run Code Online (Sandbox Code Playgroud)
谢谢!
DT[1]与DT[J(1)]我们可能想要的两种不同解释不同的原因是:
DT[1]1,DT[J(1)]如果第一个参数是数字,那么潜在的歧义只存在,这就是为什么这两种情况有两种不同的符号.
在字符键的情况下,由于字符参数只能表示第二种情况,因此不会出现这种潜在的歧义.
此外,DT["1"]问题代码中的错误是因为示例中的键不是字符,而data.table不会在此处执行类型强制.