基于此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.1
和data.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()
?