你好!
最小可重现示例:
library(data.table)
f = function(flag = FALSE) {
dt1 = data.table(a = 1)
dt2 = data.table(a = 1)
dt3 = dt1[, .(a, b = 0)]
print(body(f))
if (flag) dt3[dt2, b := 999, on = "a"]
print(body(f))
return(invisible(dt3))
}
f(flag = FALSE)
f(flag = TRUE)
> f(flag = FALSE)
{
dt1 = data.table(a = 1)
dt2 = data.table(a = 1)
dt3 = dt1[, .(a, b = 0)]
print(body(f))
if (flag)
dt3[dt2, `:=`(b, 999), on = "a"]
print(body(f))
return(invisible(dt3))
}
{
dt1 = data.table(a = 1)
dt2 = data.table(a = 1)
dt3 = dt1[, .(a, b = 0)]
print(body(f))
if (flag)
dt3[dt2, `:=`(b, 999), on = "a"]
print(body(f))
return(invisible(dt3))
}
> f(flag = TRUE)
{
dt1 = data.table(a = 1)
dt2 = data.table(a = 1)
dt3 = dt1[, .(a, b = 0)]
print(body(f))
if (flag)
dt3[dt2, `:=`(b, 999), on = "a"]
print(body(f))
return(invisible(dt3))
}
{
dt1 = data.table(a = 1)
dt2 = data.table(a = 1)
dt3 = dt1[, .(a, b = 999)]
print(body(f))
if (flag)
dt3[dt2, `:=`(b, 999), on = "a"]
print(body(f))
return(invisible(dt3))
}
如您所见,在为列“b”分配 (:=) 一个新值后(当标志为 TRUE 时),“f”函数的主体在“dt3 = ...”(“b = 0 " 替换为 "b = 999")。 使用 FALSE 标志值执行时,函数运行的结果将有所不同。
sessionInfo() 的输出:
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7600)
Matrix products: default
locale:
[1] LC_COLLATE=Russian_Russia.1251 LC_CTYPE=Russian_Russia.1251 LC_MONETARY=Russian_Russia.1251
[4] LC_NUMERIC=C LC_TIME=Russian_Russia.1251
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.12.3
loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1 yaml_2.2.0
感谢伟大的报告! 我也可以在 v1.12.2 中重现。
@mattdowle ,谢谢!
经过进一步调查,发现不需要包装功能。
以下是针对此问题的简明示例:
library(data.table)
value = 0
dt1 = data.table(a = 1)
dt2 = dt1[, .(a, b = ..value)]
dt2[1, b := 999]
print(value)
谢谢。 昨天我发现这条线有问题,确实想知道它可能不仅仅是包装纸。 所以已经有一个例子真的很好。 在制品...
相关#3766。 感谢@kirillmayantsev没有放弃我们!
最有用的评论
@mattdowle ,谢谢!
经过进一步调查,发现不需要包装功能。
以下是针对此问题的简明示例: