Data.table: عامل التعيين: = يغير جسم وظيفة الغلاف

تم إنشاؤها على ١٨ سبتمبر ٢٠١٩  ·  4تعليقات  ·  مصدر: Rdatatable/data.table

مرحبا!

مثال على الحد الأدنى من التكرار :

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 "ب = 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
High bug

التعليق الأكثر فائدة

mattdowle ، شكرا!

بعد إجراء مزيد من التحقيقات ، يتبين أنه لا توجد حاجة لوظيفة الغلاف.
فيما يلي مثال موجز لهذه المشكلة:

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

ال 4 كومينتر

شكرا على التقرير العظيم! يمكنني أيضًا إعادة الإنتاج في الإصدار 1.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 لعدم التخلي عنا!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات