r-如何在数据表1.14.3版本中使用"env"参数



我正在尝试理解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)]

关于如何将变量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-列表或环境,传递给substitute2以替换i, j and by (or keyby)中的参数。使用verbose可以预览构造的表达式。

未指定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

对于非等联接,如@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

最新更新