হ্যাঁ, এটি আর এর মধ্যে সাবসাইনমেন্ট <-
(বা =
বা ->
) ব্যবহার করে যা পুরো বস্তুর অনুলিপি তৈরি করে । আপনি এটি ব্যবহার করে tracemem(DT)
এবং .Internal(inspect(DT))
নীচের মতো করেও ট্রেস করতে পারেন । data.table
বৈশিষ্ট্য :=
এবং set()
যাই হোক না কেন রেফারেন্স দ্বারা বরাদ্দ আপত্তি তারা পাঠানো হয়। সুতরাং যদি সেই বস্তুটি আগে অনুলিপি করা হয়েছিল (সাবসাইনিং <-
বা স্পষ্ট করে copy(DT)
) তবে এটি সেই অনুলিপি যা রেফারেন্সের মাধ্যমে সংশোধিত হয়।
DT <- data.table(a = c(1, 2), b = c(11, 12))
newDT <- DT
.Internal(inspect(DT))
# @0000000003B7E2A0 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=2, tl=100)
# @00000000040C2288 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040C2250 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,12
# ATTRIB: # ..snip..
.Internal(inspect(newDT)) # precisely the same object at this point
# @0000000003B7E2A0 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=2, tl=100)
# @00000000040C2288 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040C2250 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,12
# ATTRIB: # ..snip..
tracemem(newDT)
# [1] "<0x0000000003b7e2a0"
newDT$b[2] <- 200
# tracemem[0000000003B7E2A0 -> 00000000040ED948]:
# tracemem[00000000040ED948 -> 00000000040ED830]: .Call copy $<-.data.table $<-
.Internal(inspect(DT))
# @0000000003B7E2A0 19 VECSXP g0c7 [OBJ,NAM(2),TR,ATT] (len=2, tl=100)
# @00000000040C2288 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040C2250 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,12
# ATTRIB: # ..snip..
.Internal(inspect(newDT))
# @0000000003D97A58 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=2, tl=100)
# @00000000040ED7F8 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040ED8D8 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,200
# ATTRIB: # ..snip..
এমনকি a
ভেক্টরকে কীভাবে অনুলিপি করা হয়েছিল তা লক্ষ্য করুন (ভিন্ন ভিন্ন হেক্স মান ভেক্টরের নতুন অনুলিপি নির্দেশ করে), যদিও a
পরিবর্তন করা হয়নি। এমনকি পুরো b
উপাদানটি অনুলিপি করা হয়েছিল কেবল পরিবর্তিত হওয়া উপাদানগুলির পরিবর্তনের চেয়ে। বড় ডেটার জন্য এড়ানো গুরুত্বপূর্ণ, এবং কেন :=
এবং এর set()
সাথে পরিচয় করিয়ে দেওয়া হয়েছিল data.table
।
এখন, আমাদের অনুলিপি সহ newDT
আমরা এটিকে রেফারেন্সের মাধ্যমে সংশোধন করতে পারি:
newDT
# a b
# [1,] 1 11
# [2,] 2 200
newDT[2, b := 400]
# a b # See FAQ 2.21 for why this prints newDT
# [1,] 1 11
# [2,] 2 400
.Internal(inspect(newDT))
# @0000000003D97A58 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=2, tl=100)
# @00000000040ED7F8 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040ED8D8 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,400
# ATTRIB: # ..snip ..
লক্ষ্য করুন যে সমস্ত 3 টি হেক্স মান (কলাম পয়েন্টের ভেক্টর এবং 2 টি কলামের প্রতিটি) অপরিবর্তিত রয়েছে। সুতরাং এটিকে কোনও অনুলিপি সহ সত্যই সংশোধন করা হয়েছিল।
বা, আমরা DT
রেফারেন্স দ্বারা মূলটি পরিবর্তন করতে পারি :
DT[2, b := 600]
# a b
# [1,] 1 11
# [2,] 2 600
.Internal(inspect(DT))
# @0000000003B7E2A0 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=2, tl=100)
# @00000000040C2288 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 1,2
# @00000000040C2250 14 REALSXP g0c2 [NAM(2)] (len=2, tl=0) 11,600
# ATTRIB: # ..snip..
এই হেক্সের মানগুলি DT
উপরে বর্ণিত মূল মানগুলির সমান । example(copy)
ব্যবহার করে tracemem
তুলনা করে আরও উদাহরণের জন্য টাইপ করুন data.frame
।
বিটিডব্লিউ, আপনি যদি tracemem(DT)
তবে DT[2,b:=600]
একটি কপি প্রতিবেদন দেখতে পাবেন। এটি print
পদ্ধতিটি যে প্রথম 10 টি সারির অনুলিপি করে। যখন invisible()
কোনও ফাংশন বা স্ক্রিপ্টের সাথে আবৃত হয় বা কল করা হয়, তখন print
পদ্ধতিটি কল হয় না।
এই সমস্ত কার্যকারিতা ভিতরেও প্রযোজ্য; যেমন, :=
এবং set()
এমনকি ফাংশনগুলির মধ্যেও লেখার অনুলিপি করবেন না। আপনার যদি কোনও স্থানীয় অনুলিপি পরিবর্তন করতে x=copy(x)
হয় তবে ফাংশনের শুরুতে কল করুন । তবে, মনে রাখবেন data.table
বড় ডেটা (পাশাপাশি ছোট ডেটার জন্য দ্রুত প্রোগ্রামিং সুবিধা) for আমরা ইচ্ছাকৃতভাবে বড় বস্তু (কখনও) অনুলিপি করতে চাই না। ফলস্বরূপ আমাদের থাম্বের স্বাভাবিক 3 * কার্যকরী মেমরি ফ্যাক্টর রুলের অনুমতি দেওয়ার দরকার নেই। আমরা কেবলমাত্র একটি কলামের চেয়ে বৃহত্তর ওয়ার্কিং মেমরির প্রয়োজন (যেমন 3 এর চেয়ে 1 / এনসিএল এর একটি মেমরি ফ্যাক্টর) প্রয়োজন।
<-
পরিবর্তে ব্যবহার করার পক্ষে ব্যাপকভাবে পরামর্শ দেওয়া হয়=
(যেমন গুগল: google.github.io/styleguide/Rguide.xML#assignment )। তবে এর অর্থ হ'ল ডেটা.ট্যাবল ম্যানিপুলেশন ডেটা ফ্রেম ম্যানিপুলেশনের মতোই কাজ করবে না এবং তাই ডেটা ফ্রেমে ড্রপ-ইন প্রতিস্থাপন থেকে অনেক দূরে।