لم أدرك أن DT[TRUE]
كان وسيلة لتحقيق نسخة ضحلة. النسخة السطحية مخصصة للاستخدام الداخلي فقط. بفضل @ renkun-ken لتسليط الضوء على هذا في # 3214 ، و # 2254.
في الإصدار 1.11.8 نرى هذا:
DT = data.table(id = 1:5, key="id")
DT1 = DT[TRUE]
key(DT1)
[1] "id"
DT1[3, id:=6L]
key(DT1)
# NULL # correct
DT$id
# [1] 1 2 6 4 5 # should be 1:5
key(DT)
# [1] "id" # invalid key
يحدث فقط بعد DT[TRUE]
، iiuc ، والتي نأمل أن القوم لم يكتشفوا أو يعتمدوا على الكثير ؟! آمل أن يكون الاستخدام هناك مثل وصف @ renkun-ken لإضافة أعمدة جديدة إلى النسخة الضحلة ، وليس لتغيير الأعمدة الموجودة!
تمت إضافة اختبار جديد 1542.08 في PR # 2313 جاهزًا عندما يتم إصلاح ذلك.
نعم ، setkey ، يجب عدم استخدام تغيير الأعمدة الموجودة في النسخة الضحلة حيث لا يتم نسخ الأعمدة نفسها.
إذا لم نسمح بعمل نسخة سطحية باستخدام dt[TRUE]
فسيتم حل هذه المشكلة تلقائيًا.
في النهاية. لكن في غضون ذلك ، لا يمكننا كسر سير عمل @ renkun-ken.
مزيد من التفاصيل هنا: https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046
يمكن إضافة الكود التالي إلى الاختبارات لضمان سلوك النسخ
DT = data.table(a=c(1,2), b=c("b","a"))
address(DT)
address(DT[])
address(DT[, .SD])
address(DT[TRUE])
sapply(DT, address)
sapply(DT[], address)
sapply(DT[, .SD], address)
sapply(DT[TRUE], address)
التعليق الأكثر فائدة
نعم ، setkey ، يجب عدم استخدام تغيير الأعمدة الموجودة في النسخة الضحلة حيث لا يتم نسخ الأعمدة نفسها.