برای مشاهده یافته ها از کلید Enter و برای خروج از کلید Esc استفاده کنید.

لیست ها

برخلاف آرایه، ماتریس و حتی بردارها، لیست ها در R ساختمان داده انعطاف پذیرتری هستند و امکان ذخیره سازی داده هایی با انواع مختلف را به صورت همزمان فراهم می کنند. همین قابلیت سبب می شود که کاربردهایی بسیار بیشتری برای لیست ها بتوان متصور بود. اگر بخواهیم به صورت فنی تر ماهیت یک لیست را معرفی کنیم، باید بگوییم که یک شی (Object) است که می تواند مجموعه ای مرتب از اشیا با نوع داده ای متفاوت، از جمله لیست ها دیگر، را در خود ذخیره کند.

ایجاد لیست و دسترسی به عناصر آن

برای ایجاد یک لیست از تابع list به صورت زیر استفاده می شود.

list_1 <- list ("R", "Academy", c(21,32,11), TRUE, 123.45)
list_1

# [[1]]

# [1] "R"

#

#[[2]]

#[1] "Academy"

#

#[[3]]

#[1] 21 32 11

#

#[[4]]

#[1] TRUE

#

#[[5]]

#[1] 123.45

همانگونه که مشاهده می کنید، در این مثال، لیست از چندین آیتم داده ای با انواع مختلف تشکیل شده است ولی همانطور که مطلع هستید، می توان لیستی فقط با یک نوع داده مشخص هم ایجاد کرد. نکته دوم درباره این مثال، نحوه نمایش خروجی هاست که با کمی دقت متوجه می شوید تفاوت هایی یا خروجی های تولید شده در بخش ها قبل دارد. در ادامه به این مساله پرداخته می شود ولی در این لحظه فقط به این موضوع توجه داشته باشید خروجی لیست هم در قابل یک لیست نمایش داده می شود.

یک لیست، به خودی خود می تواند شامل یک لیست دیگر نیز باشد، همانند مثال زیر:

list_2 <- list ("R", "Academy", list("shiny","RStudio","ggplot"))
list_2
# [[1]]

# [1] "R"

#

#[[2]]

#[1] "Academy"

#

#[[3]]

#[[3]][[1]]

#[1] "shiny"

#

#[[3]][[2]]

#[1] "RStudio"

#[[3]][[3]]

#[1] "ggplot"

الگوی دسترسی به عناصر لیست مشابه روشی است که برای بردارها و ماتریس ها استفاده می شود، یعنی دسترسی توسط اندیس ها.

list_2 [1]
# [[1]]
"# [1] "R

لطفا به خروجی دستور بالا توجه کنید که باز هم نتیجه در قالب یک لیست نمایش داده شده است. در برخی موارد و به خصوص زمانیکه قصد داریم عنصر بازیابی شده از یک لیست را در تابع یا برنامه دیگری مورد استفاده قرار دهیم، این نوع خروجی مفید نخواهد بود و باید بتوانیم به مقدار مورد نظر به صورت مستقیم و به صورت یک عنصر داده ای مستقل دسترسی داشته باشیم. برای انجام این کار، به صورت زیر عمل می کنیم.

list_2 [[1]]
# [1] "R"

برای دسترسی ساده و با معنی تر به عناصر لیست، می توانیم برای عناصر نام در نظر بگیریم. ارجاع به عناصر توسط نام ها هم به دو صورت قابل انجام است و البته به صورت چندگانه هم می توان این کار را انجام داد.

langs <- list(R=1, Python=2, Java=3, C=4, JS=5)
langs [["R"]]

# [1] 1
langs$R

# [1] 1

langs[c("R", "Python")]
# $R
# [1] 1
#
# $Python
# [1] 2

تغییر عناصر لیست

الگوی تغییر عناصر لیست هم تفاوت چندانی با روش هایی که پیشتر به آن ها پرداخته شد، ندارد. به مثال های زیر توجه کنید.

list_3 <- list("R","Python","C#","HTML")
list_3[[3]] <- "C++"
list_3
# [[1]]

# [1] "R"

#

#[[2]]

#[1] "Python"

#

#[[3]]

#[1] "C#"

#

#[[4]]

#[1] "HTML"

در تغییر لیست هم می توان از لیست ها برای انجام سریع و ساده تر فرایند استفاده کرد.

list_3[1:3] <- list ("CSS","PHP","SQL")
list_3
# [[1]]

# [1] "CSS"

#

#[[2]]

#[1] "PHP"

#

#[[3]]

#[1] "SQL"

#

#[[4]]

#[1] "HTML"

برای افزودن عناصر به لیست هم همانند فرایند تغییر لیست می توان از اندیس ها استفاده کرد و عنصر مورد نظر را در جایگاه (اندیس) موردنظر قرار دهیم. با اینحال تابع اختصاصی append هم برای این کار وجود دارد.

list_3 <- append(list_3, "Rust")
list_3
#[[1]]

#[1] "CSS"

#

#[[2]]

#[1] "PHP"

#

#[[3]]

#[1] "SQL"

#

#[[4]]

#[1] "HTML"
#

#[[5]]

#[1] "Rust"

دقت داشته باشید که می توان با استفاده از آرگومان after جایگاه عنصری که قصد اضافه کردن آن را داریم، مشخص کرد.

list_3 <- append(list_3, "Pascal", after=3)
list_3
#[[1]]

#[1] "CSS"

#

#[[2]]

#[1] "PHP"

#

#[[3]]

#[1] "SQL"

#

#[[4]]

#[1] "Pascal"
#

#[[5]]

#[1] "HTML"
#

#[[6]]

#[1] "Rust"

برای حذف عناصر هم اندیس آن عنصر موردنظر را به صورت منفی مورد استفاده قرار می دهیم.

list_3 <- list_3 [-2]
list_3
#[[1]]

#[1] "CSS"

#

#[[2]]

#[1] "SQL"

#

#[[3]]

#[1] "Pascal"
#

#[[4]]

#[1] "HTML"
#

#[[5]]

#[1] "Rust"

برای بررسی طول یک لیست و ترکیب دو لیست با یکدیگر به ترتیب به صورت زیر عمل می کنیم.

length(list_3)
#[1] 4

list_4 <- list ("Ruby","Perl")
list_5 <- c(list_3,list_4)
list_5

#[[1]]

#[1] "CSS"

#

#[[2]]

#[1] "SQL"

#

#[[3]]

#[1] "Pascal"
#

#[[4]]

#[1] "HTML"
#

#[[5]]

#[1] "Rust"
#

#[[6]]

#[1] "Ruby"
#

#[[7]]

#[1] "Perl"

و آخرین نکته درباره لیست ها در این بخش، چگونگی تبدیل لیست ها به بردارهاست که ممکن است در برخی موارد بسیار کاربردی باشد.

new_vec <- unlist(list_5)
new_vec
# [1] "CSS" "PHP" "SQL" "HTML" "Ruby" "Perl"