R:data.table左外部联接函数未更新

时间:2018-08-16 07:50:37

标签: r data.table

基于此previous post,我构建了leftOuterJoin,该功能可以根据另一个data.table X更新data.table Y。该函数定义如下:

leftOuterJoin <- function(X, Y, onCol) {
    .colsY <- names(Y)
    X[Y, (.colsY) := mget(paste0("i.", .colsY)), on = onCol]
}

该功能可以按预期的99%的时间运行,例如:

X <- data.table(id = 1:5, L = letters[1:5])
   id L
1:  1 a
2:  2 b
3:  3 c
4:  4 d
5:  5 e

Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12))
   id    L  N
1:  3 <NA> 10
2:  4    g NA
3:  5    h 12

leftOuterJoin(X, Y, "id")
X
   id    L  N
1:  1    a NA
2:  2    b NA
3:  3 <NA> 10
4:  4    g NA
5:  5    h 12

但是,由于某些我不知道的原因,它只是停止处理某些数据表(我手头没有可复制的示例)。没有错误,但是数据表未更新。当我使用调试功能时,一切似乎都工作正常,X已更新,但实际的data.table却没有。现在,如果我只是在功能之外进行操作。也许与功能范围有关?我真的在这个问题上苦苦挣扎。

规范:R v3.5.1data.table v1.11.4

编辑
根据评论,我发现问题与data.table指针有关。您可以使用以下代码重现该问题:

> save(X, file = "X.RData")
> load("X.RData")
> leftOuterJoin(X, Y, "id")
> X
   id    L
1:  1    a
2:  2    b
3:  3 <NA>
4:  4    g
5:  5    h

请注意,X已更新,但不是我们想要的方式。但是,如果我们使用setDT(),它将正常工作:

> load("X.RData")
> setDT(X)
> leftOuterJoin(X, Y, "id")
> X
   id    L  N
1:  1    a NA
2:  2    b NA
3:  3 <NA> 10
4:  4    g NA
5:  5    h 12

是否可以设置leftOuterJoin(),这样就不必每次加载某些数据时都运行setDT()

0 个答案:

没有答案