data.tableоб’єкти тепер мають оператор: =. Чим цей оператор відрізняється від усіх інших операторів присвоєння? Крім того, яке його використання, наскільки це швидше, і коли цього слід уникати?
data.tableоб’єкти тепер мають оператор: =. Чим цей оператор відрізняється від усіх інших операторів присвоєння? Крім того, яке його використання, наскільки це швидше, і коли цього слід уникати?
Відповіді:
Ось приклад, на якому показано 10 хвилин, скорочених до 1 секунди (з НОВИН на домашній сторінці ). Це як перепризначення до, data.frameале не кожен раз копіює всю таблицю.
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
Якщо зібрати :=в jподібних дозволяє більш ідіоми:
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
і:
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
Я не можу придумати жодної причини, щоб уникати :=! Крім, всередині forциклу. Оскільки він :=з’являється всередині DT[...], він має невеликі накладні витрати на [.data.tableметод; наприклад, S3 відправка і перевірка на наявність і тип аргументів , такі як i, by, і nomatchт.д. Таким чином , для внутрішніх forпетель, є низькі накладні витрати, прямий варіант :=називається set. Див ?setдля більш докладної інформації та прикладів. Недоліки setвключають, що iмають бути номери рядків (без двійкового пошуку), і ви не можете поєднувати його by. Завдяки цим обмеженням setможна значно зменшити накладні витрати.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)встановлює "V1"стовпець, тоді як set(DT, i, colVar, i)встановлює ім'я стовпця, що міститься у colVarзмінній (наприклад, якщо це colVar = "V1"було зроблено раніше). Лапки вказують на те, що ім'я стовпця слід сприймати буквально, а не шукати змінну.