Data.table: Zuweisungsoperator := ändert den Rumpf einer Wrapper-Funktion

Erstellt am 18. Sept. 2019  ·  4Kommentare  ·  Quelle: Rdatatable/data.table

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
High bug

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:

library(data.table)
value = 0
dt1 = data.table(a = 1)
dt2 = dt1[, .(a, b = ..value)]
dt2[1, b := 999]
print(value)

Alle 4 Kommentare

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 !

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen