R “j”中的求值顺序不是连续的`
在谈到如何编写递归计算代码时,我注意到计算顺序在R “j”中的求值顺序不是连续的`,r,data.table,R,Data.table,在谈到如何编写递归计算代码时,我注意到计算顺序在j 示例使用上一行和当前行的简单总和来演示问题,因此我不要求使用shift: library(data.table) #data.table_1.12.8 R-3.6.1 Win x64 DT <- data.table(rn=1:4, X=c(0,0,1,0), Y=c(0,0,0,0)) DT[, { A <- X[1L] B <- X[1L] .SD[-1L, {
j
示例使用上一行和当前行的简单总和来演示问题,因此我不要求使用shift
:
library(data.table) #data.table_1.12.8 R-3.6.1 Win x64
DT <- data.table(rn=1:4, X=c(0,0,1,0), Y=c(0,0,0,0))
DT[, {
A <- X[1L]
B <- X[1L]
.SD[-1L,
{
print(.BY$rn)
print(c(X=X, A=A, B=B))
#expecting the next 4 lines to be evaluated in sequence but seems like B <- X is evaluated before these 2 lines
sA <- A + Y #line 1
sB <- B + Y #line 2
B <- X #line 3
A <- copy(X) #line 4
print(c(X=X, A=A, B=B))
.(sA, sB)
},
rn]
}]
library(data.table)#data.table_1.12.8 R-3.6.1 Win x64
DT请在github中填写,如果可能的话,可以简化,而不是打印,您可以使用stopifnot(all.equal())
,这样我们可以更轻松地将其转换为单元测试。
[1] 2
X A B
0 0 0
X A B
0 0 0
[1] 3
X A B
1 0 1<- this should be 0
X A B
1 1 1
[1] 4
X A B
0 1 0<- this should be 1
X A B
0 0 0