こんにちは!
最小限の再現可能な例:
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)
ありがとう。 昨日、行に問題があることがわかりましたが、ラッパーだけではないのではないかと思いました。 ですから、すでに例があるのは本当に良いことです。 WIP ...
関連 #3766。 @kirillmayantsev さん、私たちをあきらめないでくれてありがとう!
最も参考になるコメント
@mattdowle 、ありがとう!
さらに調査した結果、ラッパー関数は必要ないことがわかりました。
この問題の簡潔な例を次に示します。