این مفهوم مهمی در 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
شما یک پرندهنگر پرشور هستید که پیگیری میکنید در هفت روز گذشته چند پرنده به باغ شما سر زدهاند.
شش وظیفه دارید که همهشان به تعداد پرندگانی مربوط میشوند که به باغ شما سر زدهاند.
تابع today() را پیادهسازی کنید تا برگرداند چند پرنده امروز به باغ شما سر زدهاند. شمارش پرندگان بر اساس روز مرتب شده است؛ اولین عنصر شمارش قدیمیترین روز است و آخرین عنصر شمارش امروز.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
تابع 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)
تابع has_day_without_birds() را پیادهسازی کنید که اگر روزی بوده که هیچ پرندهای به باغ سر نزده باشد مقدار TRUE را برمیگرداند؛ در غیر این صورت مقدار FALSE را برگردانید:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
تابع count_for_first_days() را پیادهسازی کنید که تعداد پرندگانی را برمیگرداند که از ابتدای هفته به باغ شما سر زدهاند، اما شمارش را به تعداد روزهای مشخصشده از ابتدای هفته محدود میکند.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
بعضی روزها پرمشغلهتر از بقیهاند. روز پرمشغله روزی است که پنج پرنده یا بیشتر به باغ شما سر زده باشند.
تابع busy_days() را پیادهسازی کنید تا تعداد روزهای پرمشغله را برگرداند:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
کنجکاو هستید که بدانید در مجموع چند پرنده تا اینجای هفته سر زدهاند. برای هر روز مجموع تجمعی را محاسبه کنید.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
شما گمان میکنید بازدید پرندگان تحت تأثیر الگوهای ترافیک جادههای نزدیک است، بنابراین آخر هفته با روزهای کاری فرق میکند.
مخفف نام روزها را بر اساس تعداد پرندگانی که بازدید کردهاند، به ترتیب نزولی مرتب کنید.
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"