Hallo!
Minimal reproduzierbares Beispiel :
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))
}
Wie Sie sehen können, wird nach der Zuweisung (:=) eines neuen Wertes in die Spalte "b" (wenn das Flag WAHR ist) der Rumpf der Funktion "f" in der Zeile "dt3 = ..." ("b = 0 " wird ersetzt durch "b = 999"). Das Ergebnis der Funktionsausführung wird dann unterschiedlich sein, wenn sie mit dem Flagwert FALSE ausgeführt wird.
Ausgabe von 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
Danke für den tollen Bericht! Ich kann auch in v1.12.2 reproduzieren.
@mattdowle , Danke!
Nach weiteren Untersuchungen stellt sich heraus, dass keine Wrapper-Funktion benötigt wird.
Hier ist ein prägnantes Beispiel für dieses Problem:
library(data.table)
value = 0
dt1 = data.table(a = 1)
dt2 = dt1[, .(a, b = ..value)]
dt2[1, b := 999]
print(value)
Vielen Dank. Ich habe gestern die fehlerhafte Zeile gefunden und mich gewundert, dass es sich möglicherweise nicht nur um Wrapper handelt. Da ist es wirklich gut, schon ein Beispiel zu haben. WIP...
Verwandte #3766. Danke @kirillmayantsev, dass hast !
Hilfreichster Kommentar
@mattdowle , Danke!
Nach weiteren Untersuchungen stellt sich heraus, dass keine Wrapper-Funktion benötigt wird.
Hier ist ein prägnantes Beispiel für dieses Problem: