সংক্ষিপ্ত পটভূমি: বহু ব্যবহারে সমসাময়িক প্রোগ্রামিং ল্যাঙ্গুয়েজে কমপক্ষে কয়েকটি মুভি ADT [বিমূর্ত তথ্য প্রকার] সাধারণ, বিশেষত,
স্ট্রিং (অক্ষর সমন্বিত একটি ক্রম)
তালিকা (মানগুলির একটি আদেশযুক্ত সংগ্রহ), এবং
মানচিত্র ভিত্তিক প্রকার (মানহীন কীগুলি মানচিত্রযুক্ত এমন একটি বিন্যস্ত অ্যারে)
আর প্রোগ্রামিং ভাষায় প্রথম দুটি যথাক্রমে character
এবং vector
যথাযথভাবে প্রয়োগ করা হয়।
আমি যখন আর শিখতে শুরু করি তখন দুটি জিনিস প্রায় শুরু থেকেই সুস্পষ্ট ছিল: list
এটি আর এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ ডেটা টাইপ (কারণ এটি আর এর জন্য পিতাম বর্গ data.frame
), এবং দ্বিতীয়ত, আমি কীভাবে তারা কাজ করে তা বুঝতে পারি না, কমপক্ষে আমার কোডে এগুলি সঠিকভাবে ব্যবহার করার পক্ষে যথেষ্ট নয়।
একটি জিনিসের জন্য, আমার কাছে এটি দেখে মনে হয়েছিল যে আর-এর list
ডেটা টাইপটি এডিটি মানচিত্রের সিদ্ধ বাস্তবায়ন ( dictionary
পাইথন, NSMutableDictionary
অবজেক্টিভ সি তে, hash
পার্ল এবং রুবিতে, object literal
জাভাস্ক্রিপ্টে এবং আরও কিছু)।
উদাহরণস্বরূপ, আপনি এগুলি তৈরি করেন ঠিক তেমন একটি পাইথন অভিধানের মতো, কী-কনট্রাক্টরের কাছে কী-মান জোড়া (যা পাইথনে dict
নয় list
) কে দিয়ে:
x = list("ev1"=10, "ev2"=15, "rv"="Group 1")
আর আপনি আর লিস্টের আইটেমগুলিতে অ্যাক্সেস করেন ঠিক তেমন যেমন পাইথন অভিধানের মতো x['ev1']
। তেমনি, আপনি কেবল 'কীগুলি' বা কেবল 'মানগুলি' পুনরুদ্ধার করতে পারেন :
names(x) # fetch just the 'keys' of an R list
# [1] "ev1" "ev2" "rv"
unlist(x) # fetch just the 'values' of an R list
# ev1 ev2 rv
# "10" "15" "Group 1"
x = list("a"=6, "b"=9, "c"=3)
sum(unlist(x))
# [1] 18
কিন্তু আর list
গুলি রয়েছে অসদৃশ (LANGUAGES আমি যাহাই হউক শিখেছি করেছি মধ্য থেকে) অন্য মানচিত্র-টাইপ ADTs। আমার অনুমান যে এটি এস এর প্রাথমিক অনুমানের একটি পরিণতি, অর্থাত্ গ্রাউন্ড-আপ থেকে কোনও ডেটা / স্ট্যাটিস্টিক ডিএসএল [ডোমেন-নির্দিষ্ট ভাষা] ডিজাইনের উদ্দেশ্য intention
আর list
ব্যবহারের ক্ষেত্রে অন্যান্য ভাষায় ম্যাপিংয়ের ধরণের মধ্যে তিনটি উল্লেখযোগ্য পার্থক্য (যেমন, পাইথন, পার্ল, জাভাস্ক্রিপ্ট):
প্রথম , list
দ s এর একটি হয় আদেশ সংগ্রহ, শুধু ভেক্টর মত, যদিও মান অস্থির হয় (অর্থাত, কী কোন hashable মান নয় শুধু অনুক্রমিক পূর্ণসংখ্যার হতে পারে)। প্রায় সর্বদা, অন্য ভাষাগুলিতে ম্যাপিং ডেটা টাইপটি বিন্যস্ত থাকে ।
দ্বিতীয় , list
গুলি ফাংশন যদিও আপনি একটি পাস না থেকে ফেরত পাঠানো যাবে list
যখন আপনি ফাংশন বলা, এবং যদিও ফাংশন যা ফিরে list
একটি (স্পষ্ট) ধারণ করে না list
(কন্সট্রাকটর অবশ্যই, আপনি এই সঙ্গে অনুশীলন দ্বারা মোকাবেলা করতে পারেন ফিরে আসা ফলাফলটি একটি কলটিতে মোড়ানো unlist
):
x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x) # returns 'list', not a vector of length 2
# [1] list
আর এর একটি তৃতীয় অদ্ভুত বৈশিষ্ট্য list
: মনে হয় না যে তারা অন্য একটি এডিটির সদস্য হতে পারে, এবং যদি আপনি এটি করার চেষ্টা করেন তবে প্রাথমিক ধারকটি একটি জোর করে জোর করে list
। যেমন,
x = c(0.5, 0.8, 0.23, list(0.5, 0.2, 0.9), recursive=TRUE)
class(x)
# [1] list
আমার উদ্দেশ্য এখানে ভাষা বা কীভাবে এটি নথিভুক্ত করা হয়েছে সমালোচনা করা নয়; তেমনি, আমি প্রস্তাব দিচ্ছি না যে list
ডেটা স্ট্রাকচার বা এটি কীভাবে আচরণ করে তাতে কোনও সমস্যা আছে । আমি যা করতে চাইছি তা হ'ল তারা বুঝতে পারে যে তারা কীভাবে কাজ করে তাই আমার কোডগুলিতে সেগুলি সঠিকভাবে ব্যবহার করতে পারি।
আমি আরও ভালভাবে বুঝতে চাই বিভিন্ন ধরণের জিনিস এখানে:
কোনও ফাংশন কল কখন ফিরে আসবে
list
(উদাহরণস্বরূপ,strsplit
উপরে বর্ণিত অভিব্যক্তি) কখন নিয়ম নির্ধারণ করে ?যদি আমি স্পষ্টভাবে কোনও
list
(যেমন,list(10,20,30,40)
) নামগুলি অর্পণ না করি তবে ডিফল্ট নামগুলি কেবল 1 দিয়ে শুরু হওয়া অনুক্রমিক পূর্ণসংখ্যা হয়? (আমি ধরে নিলাম, তবে আমি নিশ্চিত যে উত্তরটি হ্যাঁ থেকে অনেক দূরে, অন্যথায় আমরা এই ধরণেরlist
কোনও ভেক্টরকে ডাব্লু / কল করতে বাধ্য করতে পারব নাunlist
))এই দুটি পৃথক অপারেটর
[]
, এবং[[]]
, একই ফলাফলটি কেন দেয়?x = list(1, 2, 3, 4)
উভয় এক্সপ্রেশন ফিরে "1":
x[1]
x[[1]]
কেন এই দুটি এক্সপ্রেশন না না একই ফলাফল আসতে?
x = list(1, 2, 3, 4)
x2 = list(1:4)
দয়া করে আমাকে আর ডকুমেন্টেশন ( ?list
, R-intro
) - এ নির্দেশ করবেন না - আমি এটি মনোযোগ সহকারে পড়েছি এবং এটি আমাকে উপরে যে ধরণের প্রশ্নগুলি আবৃত্তি করেছে তার জবাব দিতে সহায়তা করে না।
(সর্বশেষে, আমি সম্প্রতি শিখেছি এবং একটি আর প্যাকেজ (সিআরএএন-তে উপলব্ধ) ব্যবহার করা শুরু করেছি hash
যা একটি এস 4 শ্রেণীর মাধ্যমে প্রচলিত মানচিত্র-জাতীয় আচরণ প্রয়োগ করে ; আমি অবশ্যই এই প্যাকেজটির সুপারিশ করতে পারি))
list
R তে হ্যাশের মতো নয়। আমার কাছে আরও একটি আছে যা আমি মনে করি নোটের যোগ্য worthy list
আর তে একই রেফারেন্স নামের সাথে দুটি সদস্য থাকতে পারে। obj <- c(list(a=1),list(a=2))
এটি বৈধ বলে বিবেচনা করুন এবং 'এ' এর দুটি নামযুক্ত মান সহ একটি তালিকা ফেরত দিন। এই দৃষ্টান্তের জন্য একটি কল obj["a"]
কেবল প্রথম ম্যাচের তালিকার উপাদানটি ফেরত দেবে। আপনি আর এর পরিবেশগুলি ব্যবহার করে রেফারেন্সড নাম অনুসারে কেবলমাত্র একটি আইটেম সহ একটি হ্যাশের অনুরূপ আচরণ (সম্ভবত অভিন্ন) পেতে পারেন eg যেমনx <- new.env(); x[["a"]] <- 1; x[["a"]] <- 2; x[["a"]]
x = list(1, 2, 3, 4)
, এই উভয়ই একই ফল দেয় না:,x[1]
এবংx[[1]]
। প্রথমটি একটি তালিকা দেয় এবং দ্বিতীয়টি একটি সংখ্যক ভেক্টরকে ফেরত দেয়। নীচে স্ক্রোলিং আমি আমার কাছে প্রদর্শিত হবে যে এই প্রশ্নের সঠিকভাবে সম্বোধন করার জন্য ডার্কই একমাত্র উত্তরদাতা।