如何在 data.table 版本 1.14.3 中使用 `env` 参数

How to use the `env` parameter in data.table version 1.14.3

我正在尝试了解 data.table 中的新 env 参数。

这有效(data.table 版本 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)]

关于如何将变量 ab 传递给 data.table 的 on 子句有什么想法吗?我了解如何通过功能来做到这一点。但是,我正在努力寻找将 ab 作为字符传递的最佳方法,并且仍然在 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 - List or an environment, passed to substitute2 for substitution of parameters in i, j and by (or keyby). Use verbose to preview constructed expressions.

未指定 envon 的用法。没有 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

对于 non-equi 加入,正如@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