আর-তে সঠিকভাবে তালিকাগুলি কীভাবে ব্যবহার করবেন?


320

সংক্ষিপ্ত পটভূমি: বহু ব্যবহারে সমসাময়িক প্রোগ্রামিং ল্যাঙ্গুয়েজে কমপক্ষে কয়েকটি মুভি 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 শ্রেণীর মাধ্যমে প্রচলিত মানচিত্র-জাতীয় আচরণ প্রয়োগ করে ; আমি অবশ্যই এই প্যাকেজটির সুপারিশ করতে পারি))


3
এর সাথে x = list(1, 2, 3, 4), এই উভয়ই একই ফল দেয় না:, x[1]এবং x[[1]]। প্রথমটি একটি তালিকা দেয় এবং দ্বিতীয়টি একটি সংখ্যক ভেক্টরকে ফেরত দেয়। নীচে স্ক্রোলিং আমি আমার কাছে প্রদর্শিত হবে যে এই প্রশ্নের সঠিকভাবে সম্বোধন করার জন্য ডার্কই একমাত্র উত্তরদাতা।
আইআরটিএফএম

2
আমি আপনার তালিকাতে কাউকে প্রসারিত করে লক্ষ্য করেছি না যে listR তে হ্যাশের মতো নয়। আমার কাছে আরও একটি আছে যা আমি মনে করি নোটের যোগ্য worthy listআর তে একই রেফারেন্স নামের সাথে দুটি সদস্য থাকতে পারে। obj <- c(list(a=1),list(a=2))এটি বৈধ বলে বিবেচনা করুন এবং 'এ' এর দুটি নামযুক্ত মান সহ একটি তালিকা ফেরত দিন। এই দৃষ্টান্তের জন্য একটি কল obj["a"]কেবল প্রথম ম্যাচের তালিকার উপাদানটি ফেরত দেবে। আপনি আর এর পরিবেশগুলি ব্যবহার করে রেফারেন্সড নাম অনুসারে কেবলমাত্র একটি আইটেম সহ একটি হ্যাশের অনুরূপ আচরণ (সম্ভবত অভিন্ন) পেতে পারেন eg যেমনx <- new.env(); x[["a"]] <- 1; x[["a"]] <- 2; x[["a"]]
রাসেলপিয়েরেস

1
আমি এই পোস্টটি গত 6 মাসের মধ্যে তিনবার উত্তরগুলির সাথে পুনরায় পড়েছি এবং প্রতিবার আরও আলোকপাত পেয়েছি। দুর্দান্ত প্রশ্ন এবং কয়েকটি দুর্দান্ত উত্তর। ধন্যবাদ.
রিচ লাইসাকোভস্কি পিএইচডি

উত্তর:


150

কেবল আপনার প্রশ্নের শেষ অংশটি সম্বোধন করতে, যেহেতু এটি সত্যই একটি listএবং vectorআর এর মধ্যে পার্থক্যটি নির্দেশ করে :

কেন এই দুটি এক্সপ্রেশন একই ফল দেয় না?

x = তালিকা (1, 2, 3, 4); x2 = তালিকা (1: 4)

একটি তালিকায় প্রতিটি উপাদান হিসাবে অন্য কোনও শ্রেণি থাকতে পারে। সুতরাং আপনার একটি তালিকা থাকতে পারে যেখানে প্রথম উপাদানটি একটি চরিত্রের ভেক্টর, দ্বিতীয়টি একটি ডেটা ফ্রেম ইত্যাদি this এই ক্ষেত্রে, আপনি দুটি আলাদা তালিকা তৈরি করেছেন। xচারটি ভেক্টর রয়েছে, প্রতিটি দৈর্ঘ্যের 1 টি। দৈর্ঘ্যের x21 ভেক্টর রয়েছে:

> length(x[[1]])
[1] 1
> length(x2[[1]])
[1] 4

সুতরাং এগুলি সম্পূর্ণ ভিন্ন তালিকা।

আর তালিকাগুলি হ্যাশ ম্যাপের ডেটা স্ট্রাকচারের মতো অনেকগুলি যাতে প্রতিটি সূচকের মান যে কোনও বস্তুর সাথে যুক্ত হতে পারে। এখানে একটি তালিকার একটি সাধারণ উদাহরণ যেখানে 3 টি পৃথক শ্রেণি রয়েছে (একটি ফাংশন সহ):

> complicated.list <- list("a"=1:4, "b"=1:3, "c"=matrix(1:4, nrow=2), "d"=search)
> lapply(complicated.list, class)
$a
[1] "integer"
$b
[1] "integer"
$c
[1] "matrix"
$d
[1] "function"

শেষ উপাদানটি অনুসন্ধানের ক্রিয়াকলাপ হিসাবে দেওয়া হয়েছে, আমি এটিকে এটির মতো কল করতে পারি:

> complicated.list[["d"]]()
[1] ".GlobalEnv" ...

এটি সম্পর্কে একটি চূড়ান্ত মন্তব্য হিসাবে: এটি লক্ষ করা উচিত যে data.frameসত্যই একটি তালিকা ( data.frameডকুমেন্টেশন থেকে ):

একটি ডেটা ফ্রেম হ'ল শ্রেণীর "ডেটা.ফ্রেম" "দেওয়া, স্বতন্ত্র সারি নামগুলির সাথে একই সংখ্যক সারিগুলির ভেরিয়েবলের একটি তালিকা is

একারণে কলামগুলিতে data.frameবিভিন্ন উপাত্তের ধরণ থাকতে পারে, যখন ম্যাট্রিক্সে কলাম থাকতে পারে না। উদাহরণ হিসাবে, এখানে আমি সংখ্যা এবং অক্ষর সহ একটি ম্যাট্রিক্স তৈরি করার চেষ্টা করব:

> a <- 1:4
> class(a)
[1] "integer"
> b <- c("a","b","c","d")
> d <- cbind(a, b)
> d
 a   b  
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
> class(d[,1])
[1] "character"

প্রথম কলামে আমি কীভাবে ডেটা টাইপটিকে সংখ্যাসূচকভাবে পরিবর্তন করতে পারি না তা নোট করুন কারণ দ্বিতীয় কলামে অক্ষর রয়েছে:

> d[,1] <- as.numeric(d[,1])
> class(d[,1])
[1] "character"

4
ধন্যবাদ, ধন্যবাদ। (যাইহোক, আপনার উদাহরণটি 'জটিল তালিকা', যেমনটি আপনি ইতিমধ্যে জেনে থাকতে পারেন, সি ++, জাভা ইত্যাদি ভাষায় 'স্যুইচ' স্টেটমেন্টের অনুলিপি করার মানক উপায়, সম্ভবত একটি ভাল উপায়) আমার যখন প্রয়োজন হয় তখন এটি আর করার জন্য)। +1
12:30

8
ঠিক আছে, যদিও আরে একটি কার্যকর switchফাংশন রয়েছে যা সেই উদ্দেশ্যে ব্যবহার করা যেতে পারে (দেখুন help(switch))।
শেন

63

আপনার প্রশ্নগুলি সম্পর্কে, আমাকে সেগুলিতে যাতে সঠিকভাবে সম্বোধন করা উচিত এবং কয়েকটি উদাহরণ দিন:

1 ) একটি তালিকা ফিরে আসে যদি এবং যখন রিটার্ন স্টেটমেন্টটি যুক্ত করে। বিবেচনা

 R> retList <- function() return(list(1,2,3,4)); class(retList())
 [1] "list"
 R> notList <- function() return(c(1,2,3,4)); class(notList())
 [1] "numeric"
 R> 

2 ) নামগুলি কেবল সেট করা হয় না:

R> retList <- function() return(list(1,2,3,4)); names(retList())
NULL
R> 

3 ) তারা একই জিনিস ফিরে না। আপনার উদাহরণ দেয়

R> x <- list(1,2,3,4)
R> x[1]
[[1]]
[1] 1
R> x[[1]]
[1] 1

যেখানে x[1]প্রথম উপাদানটি প্রদান করে x- যা একই x। প্রতিটি স্কেলার দৈর্ঘ্যের এক ভেক্টর। অন্যদিকে তালিকার x[[1]]প্রথম উপাদানটি প্রদান করে।

) সবশেষে, তারা তৈরির মধ্যে যথাক্রমে দুটি পৃথক, চারটি স্কেলারযুক্ত একটি তালিকা এবং একক উপাদান সহ একটি তালিকা (এটি চারটি উপাদানের ভেক্টর হিসাবে ঘটে)।


1
অনেক সহায়ক, ধন্যবাদ (আপনার উত্তরে আইটেম 1 টি পুনরায় - আমি সম্মত, কিন্তু আমার মনে যা ছিল তা 'স্টারস্প্লিট' এর মতো অন্তর্নির্মিত ছিল, ব্যবহারকারীর দ্বারা তৈরি ফাংশন নয়)। যে কোনও ইভেন্টে, আমার কাছ থেকে +1।
ডাব

2
@ ডগ আইটেম # 1 সম্পর্কে আমি মনে করি একমাত্র উপায় নির্দিষ্ট ফাংশন, বিভাগের জন্য সহায়তা পরীক্ষা করা Value। এর মতো ?strsplit: "x সমান দৈর্ঘ্যের একটি তালিকা"। তবে আপনার বিবেচনা করা উচিত যে ফাংশন রিটার্নের উপর নির্ভর করে বিভিন্ন মান থাকতে পারে (উদাহরণস্বরূপ নীচে তালিকা বা ভেক্টর ফিরে আসতে পারে)।
মারেক

34

কেবল আপনার প্রশ্নের একটি সাবসেট নিতে:

এই নিবন্ধটি ইন্ডেক্স উপর পার্থক্য প্রশ্নে ঠিকানাগুলি []এবং [[]]

সংক্ষেপে [[]] তালিকা থেকে একটি একক আইটেম নির্বাচন করে এবং []নির্বাচিত আইটেমগুলির একটি তালিকা ফেরত দেয়। আপনার উদাহরণে x = list(1, 2, 3, 4)'আইটেম 1 একটি একক পূর্ণসংখ্যা তবে x[[1]]একক 1 প্রদান করে এবং x[1]কেবল একটি মান সহ একটি তালিকা প্রদান করে returns

> x = list(1, 2, 3, 4)
> x[1]
[[1]]
[1] 1

> x[[1]]
[1] 1

যাইহোক, A = array( 11:16, c(2,3) ); A[5]15, ফ্ল্যাট অ্যারে হয় ?!
অস্বীকার

13

কারণগুলি (অর্ডার করা) কাজগুলি করার কারণগুলির তালিকাগুলি হ'ল আদেশযুক্ত ধারকটির প্রয়োজনীয়তা সম্বোধন করা যা কোনও নোডে যে কোনও ধরণের থাকতে পারে, যা ভেক্টরগুলি না করে। তালিকাগুলি আর এর বিভিন্ন ধরণের জন্য আবার ব্যবহার করা হয় যার সাথে ক এর ভিত্তি গঠন করা হয় data.frameযা স্বেচ্ছাসেবীর ধরণের (তবে একই দৈর্ঘ্যের) ভেক্টরগুলির একটি তালিকা।

কেন এই দুটি এক্সপ্রেশন একই ফল দেয় না?

x = list(1, 2, 3, 4); x2 = list(1:4)

@ শেনের উত্তর যুক্ত করতে, আপনি যদি একই ফলাফল পেতে চান তবে চেষ্টা করুন:

x3 = as.list(1:4)

যা ভেক্টরকে 1:4একটি তালিকায় জোর করে।


11

এটিতে আরও একটি বিষয় যুক্ত করতে:

আর একটি ডাটা কাঠামো পাইথন অভি সমতূল্য আছে প্যাকেজওপেন ডেটা গ্রুপ থেকে আপনি এই ব্লগ পোস্টে এটি সম্পর্কে পড়তে পারেন । এখানে একটি সাধারণ উদাহরণ:hash

> library(hash)
> h <- hash( keys=c('foo','bar','baz'), values=1:3 )
> h[c('foo','bar')]
<hash> containing 2 key-value pairs.
  bar : 2
  foo : 1

ব্যবহারের ক্ষেত্রে, hashবর্গটি একটি তালিকার সাথে খুব মিল similar তবে পারফরম্যান্স বড় ডেটাসেটের জন্য আরও ভাল।


1
আমি হ্যাশ প্যাকেজ সম্পর্কে সচেতন - এটি আমার মূল প্রশ্নে theতিহ্যবাহী হ্যাশ ধরণের জন্য উপযুক্ত প্রক্সি হিসাবে উল্লেখ করা হয়েছে।
ফাগু

এছাড়াও নোট করুন: হ্যাশ :: হ্যাশ ব্যবহার হ্যাশ পরিবেশ, rpubs.com/rpierce/hashBenchmark এর সাথে সম্পর্কিত প্রশ্নোপযোগী ইউটিলিটি ।
রাসেলপিয়ার্স

9

তুমি বলো:

অন্যটির জন্য, ফাংশন থেকে তালিকাটি ফিরতে পারে যদিও আপনি ফাংশনটি ডাকার সময় কোনও তালিকায় কখনই পাস করেননি, এবং ফাংশনে কোনও তালিকা নির্মাণকারী নেই, যেমন,

x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x)
# => 'list'

এবং আমি অনুমান করি আপনি পরামর্শ দিচ্ছেন যে এটি একটি সমস্যা (?)। আমি এখানে এসেছি কেন এটি কোনও সমস্যা নয় :-)। আপনার উদাহরণটি কিছুটা সহজ, আপনি যখন স্ট্রিং-বিভক্ত করবেন তখন আপনার 1 এলিমেন্ট দীর্ঘ উপাদানগুলির সাথে একটি তালিকা থাকবে, তাই আপনি জানেন যে x[[1]]এটি একই unlist(x)[1]। তবে কী হবে যদি strsplitপ্রতিটি বিনের বিভিন্ন দৈর্ঘ্যের ফলাফল ফিরে আসে। কেবল কোনও ভেক্টর (বনাম একটি তালিকা) ফিরিয়ে দেওয়া মোটেও তা করবে না।

এই ক্ষেত্রে:

stuff <- c("You, me, and dupree",  "You me, and dupree",
           "He ran away, but not very far, and not very fast")
x <- strsplit(stuff, ",")
xx <- unlist(strsplit(stuff, ","))

(প্রথম যদি x: কোন একটি তালিকা ফেরৎ), আপনি যেমন বলে দিতে পারে 2nd 3rd স্ট্রিং এর "অংশ" ছিল: x[[3]][2]xxফলাফলগুলি "নিবিড় করা" ( unlist-ড) হয়ে এখন আপনি কীভাবে এটি ব্যবহার করতে পারেন ?


5
x = list(1, 2, 3, 4)
x2 = list(1:4)
all.equal(x,x2)

1: 4 সি (1,2,3,4) এর সমান হওয়ায় একই নয়। আপনি যদি সেগুলি একই হয়ে থাকেন তবে:

x = list(c(1,2,3,4))
x2 = list(1:4)
all.equal(x,x2)

4

এটি একটি খুব পুরানো প্রশ্ন, তবে আমি মনে করি যে একটি নতুন উত্তর কিছু মূল্য যুক্ত করতে পারে যেহেতু, আমার মতে, ওপিতে উদ্বেগের কোনও সরাসরি সমাধান করেননি কেউ।

গৃহীত উত্তর কি প্রস্তাব দেওয়া সত্ত্বেও, listদ বস্তু না হ্যাশ মানচিত্র। আপনি যদি অজগরটির সাথে একটি সমান্তরাল করতে listচান, তবে আপনি আরও বেশি পছন্দ করেন, আপনি অনুমান করেন, পাইথন listএস (বা tupleআসলে)।

অভ্যন্তরীণভাবে বেশিরভাগ আর অবজেক্ট কীভাবে সংরক্ষণ করা হয় তা বর্ণনা করা আরও ভাল (কোনও R এর অবজেক্টের সি টাইপ SEXP)। এগুলি মূলত তিনটি অংশে তৈরি:

  • একটি শিরোনাম, যা বস্তুর আর প্রকার, দৈর্ঘ্য এবং কিছু অন্যান্য মেটা ডেটা ঘোষণা করে;
  • ডেটা অংশ, যা একটি স্ট্যান্ডার্ড সি হিপ-বরাদ্দ করা অ্যারে (মেমরির সংলগ্ন ব্লক);
  • বৈশিষ্ট্যগুলি, যা অন্যান্য আর অবজেক্টের জন্য পয়েন্টারগুলির একটি নামযুক্ত লিঙ্কযুক্ত তালিকা (বা NULLযদি বস্তুর বৈশিষ্ট্য না থাকে)।

অভ্যন্তরীণ দৃষ্টিকোণ থেকে, উদাহরণস্বরূপ একটি listএবং numericভেক্টরের মধ্যে সামান্য পার্থক্য রয়েছে । তাদের সংরক্ষণ করা মানগুলি পৃথক। আমরা আগে বর্ণিত দৃষ্টান্তে দুটি বস্তু ভাঙ্গি:

x <- runif(10)
y <- list(runif(10), runif(3))

এর জন্য x:

  • শিরোনামটি বলবে যে প্রকারটি numeric( REALSXPসি-সাইডে), দৈর্ঘ্য 10 এবং অন্যান্য স্টাফ।
  • ডেটা অংশটি 10 ​​টি doubleমান সহ একটি অ্যারে হবে ।
  • বৈশিষ্ট্যগুলি হ'ল NULL, যেহেতু বস্তুর কোনওটি নেই।

এর জন্য y:

  • শিরোনামটি বলবে যে প্রকারটি list( VECSXPসি-সাইডে), দৈর্ঘ্য 2 এবং অন্যান্য স্টাফ।
  • তথ্য পার্ট দুই SEXP ধরনের 2 পয়েন্টার ধারণকারী একটি অ্যারের, দ্বারা প্রাপ্ত মান নির্দেশ হতে হবে runif(10)এবং runif(3)যথাক্রমে।
  • বৈশিষ্ট্য হিসাবে NULL, হিসাবে x

সুতরাং একটি numericভেক্টর এবং একটি এর মধ্যে পার্থক্যটি listহ'ল numericডেটা অংশটি doubleমানগুলি দিয়ে তৈরি হয় , যখন listডেটা অংশের জন্য অন্যান্য আর অবজেক্টের জন্য পয়েন্টারের অ্যারে হয়।

নাম দিয়ে কি হয়? ঠিক আছে, নামগুলি হ'ল কয়েকটি বৈশিষ্ট্য যা আপনি কোনও বস্তুকে অর্পণ করতে পারেন। নীচের বিষয়টি দেখুন:

z <- list(a=1:3, b=LETTERS)
  • শিরোনামটি বলবে যে প্রকারটি list( VECSXPসি-সাইডে), দৈর্ঘ্য 2 এবং অন্যান্য স্টাফ।
  • তথ্য পার্ট দুই SEXP ধরনের 2 পয়েন্টার ধারণকারী একটি অ্যারের, দ্বারা প্রাপ্ত মান নির্দেশ হতে হবে 1:3এবং LETTERSযথাক্রমে।
  • বৈশিষ্ট্যগুলি এখন উপস্থিত এবং একটি namesউপাদান যা characterমান সহ একটি আর অবজেক্ট c("a","b")

আর স্তর থেকে, আপনি attributesফাংশন দিয়ে কোনও বস্তুর বৈশিষ্ট্যগুলি পুনরুদ্ধার করতে পারেন ।

আর-তে একটি হ্যাশ মানচিত্রের মূল-মূল বৈশিষ্ট্যটি কেবল একটি বিভ্রম। যখন তুমি বললে:

z[["a"]]

এটিই ঘটে:

  • [[উপসেট ফাংশন বলা হয়;
  • ফাংশনটির আর্গুমেন্ট ( "a") প্রকারভেদযুক্ত character, সুতরাং পদ্ধতির namesঅবজেক্টের অ্যাট্রিবিউট (যদি উপস্থিত থাকে) থেকে এই জাতীয় মান অনুসন্ধান করার নির্দেশ দেওয়া হয় z;
  • যদি namesবৈশিষ্ট্যটি না থাকে, NULLফিরে আসে;
  • যদি উপস্থিত থাকে তবে "a"মানটি এটিতে অনুসন্ধান করা হবে। যদি "a"বস্তুর নাম না NULLহয় তবে ফেরত দেওয়া হয়;
  • যদি উপস্থিত থাকে তবে অবস্থানটি নির্ধারিত হয় (উদাহরণের মধ্যে 1)। সুতরাং তালিকার প্রথম উপাদানটি সমান, অর্থাৎ সমান z[[1]]

মূল-মান অনুসন্ধানটি বরং পরোক্ষ এবং সর্বদা অবস্থানগত। এছাড়াও, মনে রাখা দরকারী:

  • হ্যাশ মানচিত্রে একটি কীটির একমাত্র সীমা থাকা সীমাবদ্ধতা হ'ল এটি অবশ্যই প্রাপ্য হবেnamesআর এ অবশ্যই স্ট্রিং ( characterভেক্টর) থাকতে হবে ;
  • হ্যাশ মানচিত্রে আপনার দুটি অভিন্ন কী থাকতে পারে না। আর-তে, আপনি namesবারবার মান সহ একটি বস্তুকে বরাদ্দ করতে পারেন । এই ক্ষেত্রে:

    names(y) <- c("same", "same")

    আর এ পুরোপুরি বৈধ you আপনি যখন চেষ্টা y[["same"]]করবেন প্রথম মানটি পুনরুদ্ধার করা। এই মুহুর্তে আপনার জানা উচিত।

উপসংহারে, কোনও বস্তুর যথেচ্ছ গুণাবলী দেওয়ার ক্ষমতা আপনাকে বাহ্যিক দৃষ্টিকোণ থেকে পৃথক কোনও কিছুর চেহারা দেয়। তবে আর listএস কোনওভাবেই হ্যাশ মানচিত্র নয়।


2

ভেক্টর এবং অন্যান্য ভাষা থেকে হ্যাশ / অ্যারে ধারণা সম্পর্কিত:

  1. ভেক্টরগুলি হ'ল আর। উদাহরণস্বরূপ, rpois(1e4,5)(5 টি এলোমেলো সংখ্যা), numeric(55)(দৈর্ঘ্য-55 শূন্য ভেক্টর দ্বিগুণ) এবং character(12)(12 খালি স্ট্রিং) সমস্তগুলি "বেসিক"।

  2. হয় তালিকা বা ভেক্টর থাকতে পারে names

    > n = numeric(10)
    > n
     [1] 0 0 0 0 0 0 0 0 0 0
    > names(n)
    NULL
    > names(n) = LETTERS[1:10]
    > n
    A B C D E F G H I J 
    0 0 0 0 0 0 0 0 0 0
  3. ভেক্টরগুলিকে একই ডেটা ধরণের হতে হবে। এটা দেখ:

    > i = integer(5)
    > v = c(n,i)
    > v
    A B C D E F G H I J           
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    > class(v)
    [1] "numeric"
    > i = complex(5)
    > v = c(n,i)
    > class(v)
    [1] "complex"
    > v
       A    B    C    D    E    F    G    H    I    J                          
    0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i 0+0i
  4. তালিকাগুলিতে পৃথক পৃথক ডেটা ধরণের ধারণাগুলি থাকতে পারে, যেমন অন্যান্য উত্তরগুলিতে দেখা যায় এবং নিজেই ওপি'র প্রশ্ন।

আমি এমন ভাষা (রুবি, জাভাস্ক্রিপ্ট) দেখেছি যার মধ্যে "অ্যারে "গুলিতে ভেরিয়েবল ডেটাটাইপ থাকতে পারে তবে উদাহরণস্বরূপ সি ++ এ" অ্যারে "সমস্ত একই ডেটাটাইপ হতে হবে। আমি বিশ্বাস করি এটি একটি গতি / দক্ষতার জিনিস: আপনার যদি থাকে তবে আপনি numeric(1e6)এর আকার এবং প্রতিটি উপাদানটির অবস্থান একটি অগ্রাধিকার সম্পর্কে জানেন ; যদি "Flying Purple People Eaters"জিনিসটিতে কিছু অজানা টুকরো থাকতে পারে তবে এ সম্পর্কে প্রাথমিক তথ্য জানতে আপনাকে আসলে জিনিসপত্র বিশ্লেষণ করতে হবে।

যখন প্রকারটি নিশ্চিত হয় তখন নির্দিষ্ট স্ট্যান্ডার্ড আর ক্রিয়াকলাপগুলি আরও বেশি অর্থবোধ করে। উদাহরণস্বরূপ cumsum(1:9)বোঝায় যে যেখানে cumsum(list(1,2,3,4,5,'a',6,7,8,9))না, প্রকারটি দ্বিগুণ হওয়ার নিশ্চয়তা দেওয়া ছাড়া।


আপনার দ্বিতীয় প্রশ্ন হিসাবে:

আপনি ফাংশনটি কল করার সময় আপনি কোনও তালিকায় কখনও পাস করেননি এমনকী তালিকাগুলি ফাংশন থেকে ফিরে আসতে পারে

সমস্ত সময় ইনপুট থাকার চেয়ে ফাংশনগুলি বিভিন্ন উপাত্ত ফেরত দেয়। plotপ্লটটিকে ইনপুট হিসাবে গ্রহণ না করা সত্ত্বেও একটি প্লট প্রদান করে। Argএকটি ফেরৎ numericযদিও এটি একটি গ্রহণযোগ্য complex। প্রভৃতি

(এবং হিসাবে strsplit: উত্স কোডটি এখানে ))


2

এটি বেশ পুরাতন প্রশ্ন আমার অবশ্যই বলতে হবে এটি আর এর প্রথম পদক্ষেপের সময় আমি যে জ্ঞানটি হারিয়েছিলাম ঠিক তার ছোঁয়াচ্ছে - অর্থ কীভাবে আমার হাতে থাকা তথ্যটি আরে অবজেক্ট হিসাবে প্রকাশ করা যায় বা বিদ্যমান বস্তুগুলি থেকে কীভাবে নির্বাচন করতে হয়। কোনও আর নবজাতকের পক্ষে প্রথম থেকেই "একটি আর বক্সে" ভাবা সহজ নয়।

সুতরাং আমি নিজে নীচে ক্রাচগুলি ব্যবহার করতে শুরু করেছি যা কোন ডেটাগুলির জন্য কোন জিনিসটি ব্যবহার করতে হবে এবং মূলত বাস্তব বিশ্বের ব্যবহারের কল্পনা করতে আমাকে অনেক বেশি সহায়তা করেছিল।

যদিও আমি প্রশ্নের সঠিক উত্তর না দিচ্ছি নীচের সংক্ষিপ্ত পাঠ্যটি পাঠককে সাহায্য করতে পারে যারা সবেমাত্র আর দিয়ে শুরু করেছিলেন এবং সিমিলার প্রশ্ন জিজ্ঞাসা করছেন।

  • পারমাণবিক ভেক্টর ... আমি নিজের জন্য "সিকোয়েন্স" বলেছিলাম, কোনও দিকনির্দেশনা নেই, কেবল একই ধরণের ক্রম। [সাব-সেট নির্বাচন।
  • ভেক্টর ... 2D, [উপগ্রহ থেকে এক দিকের ক্রম ।
  • ম্যাট্রিক্স ... একই দৈর্ঘ্য সহ সারি বা কলামগুলি, [সারি এবং কলাম দ্বারা উপসেটগুলি বা ক্রম অনুসারে ভেক্টরগুলির গোছা ।
  • অ্যারে ... স্তরযুক্ত ম্যাট্রিকগুলি 3 ডি গঠন করছে
  • ডেটাফ্রেম ... এক্সেলের মতো একটি 2 ডি টেবিল, যেখানে আমি সারি বা কলামগুলি বাছাই করতে বা সরাতে বা আর্ট তৈরি করতে পারি। তাদের সাথে ক্রিয়াকলাপ, কেবলমাত্র কিছু সময়ের পরে আমি সত্যিকার অর্থেই স্বীকৃত হয়েছি যে ডেটাফ্রেম হ'ল সারি এবং কলামগুলি listব্যবহার [করে, এমনকি এমনকি ব্যবহার করে আমি সাবসেট করতে পারি তার একটি চতুর বাস্তবায়ন [[
  • তালিকা ... নিজেকে সাহায্য করার জন্য আমি তালিকা সম্পর্কে ভেবেছিলাম tree structureযেখানে [i]শাখা [[i]]থেকে পুরো শাখা এবং ফেরত আইটেম নির্বাচন করে এবং ফেরত দেয়। আর যেহেতু এটা এটা tree like structure, আপনি এমনকি একটি ব্যবহার করতে পারেন index sequenceএকটি খুব জটিল উপর প্রতি একক পাতার মোকাবেলার listতার ব্যবহার [[index_vector]]। তালিকাগুলি সহজ বা খুব জটিল হতে পারে এবং বিভিন্ন ধরণের অবজেক্টগুলিকে এক সাথে মিশতে পারে।

সুতরাং আপনি নীচের উদাহরণের মতো পরিস্থিতির উপর নির্ভর করে listsকীভাবে নির্বাচন করতে পারেন তার আরও উপায়গুলি দিয়ে শেষ করতে পারেন leaf

l <- list("aaa",5,list(1:3),LETTERS[1:4],matrix(1:9,3,3))
l[[c(5,4)]] # selects 4 from matrix using [[index_vector]] in list
l[[5]][4] # selects 4 from matrix using sequential index in matrix
l[[5]][1,2] # selects 4 from matrix using row and column in matrix

এই চিন্তাভাবনা আমাকে অনেক সাহায্য করেছিল।


1

যদি এটি সহায়তা করে তবে আমি আর-তে অন্যান্য প্রাক-ওও ভাষায় "রেকর্ডস" হিসাবে "তালিকাগুলি" ধারণ করার প্রবণতা রাখি:

  • ওভাররিচিংয়ের ধরণ সম্পর্কে তারা কোনও ধারনা তৈরি করে না (বা বরং কোনও ধনাত্মক এবং ক্ষেত্রের নামের সমস্ত সম্ভাব্য রেকর্ডের প্রকার উপলব্ধ)।
  • তাদের ক্ষেত্রগুলি বেনামে থাকতে পারে (তারপরে আপনি কঠোর সংজ্ঞা অর্ডার দিয়ে এগুলি অ্যাক্সেস করতে পারেন)।

"রেকর্ড" নামটি ডাটাবেস পার্লেন্সে "রেকর্ডস" (ওরফে সারি) এর স্ট্যান্ডার্ড অর্থের সাথে সংঘর্ষ করবে এবং এই কারণেই তাদের নামটি নিজেই প্রস্তাবিত: তালিকা হিসাবে (ক্ষেত্রের)।


1

এই দুটি পৃথক অপারেটর [ ], এবং [[ ]], একই ফলাফলটি কেন দেয়?

x = list(1, 2, 3, 4)
  1. [ ]সাব সেটিং অপারেশন সরবরাহ করে। সাধারণভাবে যে কোনও অবজেক্টের সাব সেটটিতে মূল অবজেক্টের মতোই টাইপ থাকবে। সুতরাং, x[1] একটি তালিকা সরবরাহ করে। একইভাবে x[1:2]মূল তালিকার একটি উপসেট, সুতরাং এটি একটি তালিকা। যাত্রা।

    x[1:2]
    
    [[1]] [1] 1
    
    [[2]] [1] 2
  2. [[ ]]তালিকা থেকে একটি উপাদান আহরণের জন্য হয়। x[[1]]বৈধ এবং তালিকা থেকে প্রথম উপাদান নিষ্কাশন। সাব সেটিং x[[1:2]]যেমন সরবরাহ [[ ]]করে না তেমন বৈধ নয় [ ]

     x[[2]] [1] 2 
    
    > x[[2:3]] Error in x[[2:3]] : subscript out of bounds
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.