我正在尝试理解data.table.中的新env
参数
这是有效的(数据表版本1.14.3(
df1 = data.table(x=seq(1,10))
a="x"
df1[a<5, env=list(a=a)]
x
1: 1
2: 2
3: 3
4: 4
然而,我无法让它在加入条件中工作
df1 = data.table(x=seq(1,10), xz=rnorm(10))
df2 = data.table(y=seq(5,14), yz=rnorm(10))
a="x"
b="y"
# This fails
df1[df2, on=.(a<b), nomatch=0, env=list(a=a,b=b)]
关于如何将变量a
和b
传递到data.table的on
子句,有什么想法吗?我知道如何通过函数来实现。然而,我正在努力寻找将a
和b
作为字符传递的最佳方法,并且仍然在on
子句中使用
# This works
func <- function(d1,d2,a,b) {
eval(substitute(d1[d2, on=.(a<b), nomatch=0]))
}
func(df1,df2,x,y)
根据?data.table
(1.14.3
(的文档
env-列表或环境,传递给substitute2以替换
i, j and by (or keyby)
中的参数。使用verbose可以预览构造的表达式。
未指定env
与on
的用法。没有eval/substitute
的选项是在on
中传递named
矢量
out1 <- df1[df2, on = setNames(b, a), nomatch = 0]
-使用实际列的输出进行检查
> out2 <- df1[df2, on = .(x = y), nomatch = 0]
> identical(out1, out2)
[1] TRUE
对于非等联接,如@jangorecki在注释中所述,使用substitute2
eval(substitute2(df1[df2, on = .(a <b), nomatch = 0], env = list(a=a, b = b)))
-输出
x xz yz
<int> <num> <num>
1: 5 -1.1259516 -0.78272556
2: 5 -0.4893074 -0.78272556
3: 5 1.8534867 -0.78272556
4: 5 -0.0376076 -0.78272556
5: 6 -1.1259516 -0.38678402
6: 6 -0.4893074 -0.38678402
7: 6 1.8534867 -0.38678402
8: 6 -0.0376076 -0.38678402
9: 6 -0.8409438 -0.38678402
10: 7 -1.1259516 1.18356550
11: 7 -0.4893074 1.18356550
12: 7 1.8534867 1.18356550
13: 7 -0.0376076 1.18356550
14: 7 -0.8409438 1.18356550
15: 7 2.4536938 1.18356550
16: 8 -1.1259516 1.01226735
17: 8 -0.4893074 1.01226735
18: 8 1.8534867 1.01226735
19: 8 -0.0376076 1.01226735
20: 8 -0.8409438 1.01226735
21: 8 2.4536938 1.01226735
22: 8 -0.4296828 1.01226735
23: 9 -1.1259516 0.64996351
24: 9 -0.4893074 0.64996351
25: 9 1.8534867 0.64996351
26: 9 -0.0376076 0.64996351
27: 9 -0.8409438 0.64996351
28: 9 2.4536938 0.64996351
29: 9 -0.4296828 0.64996351
30: 9 0.9030399 0.64996351
31: 10 -1.1259516 -1.23172125
32: 10 -0.4893074 -1.23172125
33: 10 1.8534867 -1.23172125
34: 10 -0.0376076 -1.23172125
35: 10 -0.8409438 -1.23172125
36: 10 2.4536938 -1.23172125
37: 10 -0.4296828 -1.23172125
38: 10 0.9030399 -1.23172125
39: 10 0.5757248 -1.23172125
40: 11 -1.1259516 0.21203485
41: 11 -0.4893074 0.21203485
42: 11 1.8534867 0.21203485
43: 11 -0.0376076 0.21203485
44: 11 -0.8409438 0.21203485
45: 11 2.4536938 0.21203485
46: 11 -0.4296828 0.21203485
47: 11 0.9030399 0.21203485
48: 11 0.5757248 0.21203485
49: 11 -1.1732665 0.21203485
50: 12 -1.1259516 -1.28178320
51: 12 -0.4893074 -1.28178320
52: 12 1.8534867 -1.28178320
53: 12 -0.0376076 -1.28178320
54: 12 -0.8409438 -1.28178320
55: 12 2.4536938 -1.28178320
56: 12 -0.4296828 -1.28178320
57: 12 0.9030399 -1.28178320
58: 12 0.5757248 -1.28178320
59: 12 -1.1732665 -1.28178320
60: 13 -1.1259516 -0.03909294
61: 13 -0.4893074 -0.03909294
62: 13 1.8534867 -0.03909294
63: 13 -0.0376076 -0.03909294
64: 13 -0.8409438 -0.03909294
65: 13 2.4536938 -0.03909294
66: 13 -0.4296828 -0.03909294
67: 13 0.9030399 -0.03909294
68: 13 0.5757248 -0.03909294
69: 13 -1.1732665 -0.03909294
70: 14 -1.1259516 0.25522954
71: 14 -0.4893074 0.25522954
72: 14 1.8534867 0.25522954
73: 14 -0.0376076 0.25522954
74: 14 -0.8409438 0.25522954
75: 14 2.4536938 0.25522954
76: 14 -0.4296828 0.25522954
77: 14 0.9030399 0.25522954
78: 14 0.5757248 0.25522954
79: 14 -1.1732665 0.25522954