مسیرها
/
R
R
/
تمرین‌ها
/
پرنده‌نگر
پرنده‌نگر

پرنده‌نگر

تمرین یادگیری

مقدمه

این مفهوم مهمی در R است. برای اینکه امکانات را بهتر بفهمید، مفید است بعد ورودی و خروجی توابع گوناگون را در نظر بگیرید.

ورودی بردار، خروجی اسکالر

قبلاً توابعی را دیدیم که یک بردار می‌گیرند و یک مقدار منفرد شبیه اسکالر برمی‌گردانند:

> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15

بسیاری از توابع آماری نیز در این دسته قرار می‌گیرند، مانند mean().

برای بردارهای منطقی، all() و any() وجود دارند.

ورودی بردار، خروجی بردار

بسیاری از توابع در R روی کل بردارها عمل می‌کنند و اغلب خروجی برداری می‌دهند. این شامل بیشتر توابع ریاضی می‌شود:

> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5

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

برای مرتب‌سازی یک بردار، sort() برای برگرداندن مقادیر و order() برای برگرداندن اندیس‌ها وجود دارد:

> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
> order(v)
#> [1] 2 1 4 3 5

حالت پیش‌فرض مرتب‌سازی به‌صورت صعودی است. در صورت نیاز decreasing = TRUE را مشخص کنید، یا از rev() برای معکوس کردن یک بردار موجود استفاده کنید.

v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not"   "in"    "I"     "am"

rev(1:4)
#> [1] 4 3 2 1

همچنین توابعی برای تولید خروجی‌های برداری تجمعی وجود دارد که روی بردار ورودی از چپ به راست عمل می‌کنند:

> cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
> cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

ورودی چند بردار، خروجی بردار

گسترشی از این مفهوم را نیز می‌توان برای مقایسه‌ی بردارها به کار برد. برای مثال، تابع بیشینه‌ی جفتی pmax() را در نظر بگیرید:

> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

دستورالعمل‌ها

شما یک پرنده‌نگر پرشور هستید که پیگیری می‌کنید در هفت روز گذشته چند پرنده به باغ شما سر زده‌اند.

شش وظیفه دارید که همه‌شان به تعداد پرندگانی مربوط می‌شوند که به باغ شما سر زده‌اند.

1. بررسی کنید امروز چند پرنده سر زده‌اند

تابع today() را پیاده‌سازی کنید تا برگرداند چند پرنده امروز به باغ شما سر زده‌اند. شمارش پرندگان بر اساس روز مرتب شده است؛ اولین عنصر شمارش قدیمی‌ترین روز است و آخرین عنصر شمارش امروز.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1

2. شمارش امروز را یک واحد افزایش دهید

تابع increment_todays_count() را پیاده‌سازی کنید تا شمارش امروز را یک واحد افزایش دهد:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)

3. بررسی کنید آیا روزی بوده که هیچ پرنده‌ای سر نزده باشد

تابع has_day_without_birds() را پیاده‌سازی کنید که اگر روزی بوده که هیچ پرنده‌ای به باغ سر نزده باشد مقدار TRUE را برمی‌گرداند؛ در غیر این صورت مقدار FALSE را برگردانید:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true

4. تعداد پرندگان بازدیدکننده را برای چند روز اول محاسبه کنید

تابع count_for_first_days() را پیاده‌سازی کنید که تعداد پرندگانی را برمی‌گرداند که از ابتدای هفته به باغ شما سر زده‌اند، اما شمارش را به تعداد روزهای مشخص‌شده از ابتدای هفته محدود می‌کند.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14

5. تعداد روزهای پرمشغله را محاسبه کنید

بعضی روزها پرمشغله‌تر از بقیه‌اند. روز پرمشغله روزی است که پنج پرنده یا بیشتر به باغ شما سر زده باشند. تابع busy_days() را پیاده‌سازی کنید تا تعداد روزهای پرمشغله را برگرداند:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2

6. مجموع تجمعی بازدید پرندگان در هفته‌ی گذشته را محاسبه کنید

کنجکاو هستید که بدانید در مجموع چند پرنده تا اینجای هفته سر زده‌اند. برای هر روز مجموع تجمعی را محاسبه کنید.

running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1]  7 13 18 22 25 27 28

7. نام روزها را بر اساس میزان پرمشغله بودنشان مرتب کنید

شما گمان می‌کنید بازدید پرندگان تحت تأثیر الگوهای ترافیک جاده‌های نزدیک است، بنابراین آخر هفته با روزهای کاری فرق می‌کند.

مخفف نام روزها را بر اساس تعداد پرندگانی که بازدید کرده‌اند، به ترتیب نزولی مرتب کنید.

day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
R Exercism

آماده‌اید پرنده‌نگر را شروع کنید؟

در Exercism ثبت‌نام کنید تا R را همراه با 21 مفهوم111 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.