وظائف R


الوظيفة عبارة عن كتلة من التعليمات البرمجية يتم تشغيلها فقط عند استدعائها.

يمكنك تمرير البيانات ، المعروفة باسم المعلمات ، إلى دالة.

يمكن للدالة إرجاع البيانات كنتيجة.


خلق وظيفة

لإنشاء وظيفة ، استخدم function()الكلمة الأساسية:

مثال

my_function <- function() { # create a function with the name my_function
  print("Hello World!")
}

استدعاء وظيفة

لاستدعاء دالة ، استخدم اسم الدالة متبوعًا بأقواس ، مثل my_function () :

مثال

my_function <- function() {
  print("Hello World!")
}

my_function() # call the function named my_function

الحجج

يمكن تمرير المعلومات إلى وظائف كوسائط.

يتم تحديد الوسيطات بعد اسم الوظيفة ، داخل الأقواس. يمكنك إضافة العديد من الوسائط كما تريد ، فقط افصل بينها بفاصلة.

المثال التالي له دالة ذات وسيطة واحدة (fname). عندما يتم استدعاء الوظيفة ، نقوم بتمرير الاسم الأول ، والذي يتم استخدامه داخل الوظيفة لطباعة الاسم الكامل:

مثال

my_function <- function(fname) {
  paste(fname, "Griffin")
}

my_function("Peter")
my_function("Lois")
my_function("Stewie")

معلمات أم حجج؟

يمكن استخدام المصطلحين "معلمة" و "وسيطة" لنفس الشيء: المعلومات التي يتم تمريرها إلى وظيفة.

من منظور الوظيفة:

المعلمة هي المتغير المدرج داخل الأقواس في تعريف الوظيفة.

الوسيطة هي القيمة التي يتم إرسالها إلى الوظيفة عندما يتم استدعاؤها.



عدد الحجج

بشكل افتراضي ، يجب استدعاء الدالة بالعدد الصحيح من الوسائط. بمعنى أنه إذا كانت وظيفتك تتوقع وسيطتين ، فعليك استدعاء الدالة باستخدام وسيطتين ، وليس أكثر وليس أقل:

مثال

تتوقع هذه الوظيفة وسيطتين ، وتحصل على وسيطتين:

my_function <- function(fname, lname) {
  paste(fname, lname)
}

my_function("Peter", "Griffin")

إذا حاولت استدعاء الدالة باستخدام 1 أو 3 وسيطات ، فستتلقى خطأ:

مثال

تتوقع هذه الوظيفة وسيطتين ، وتحصل على وسيطة واحدة:

my_function <- function(fname, lname) {
  paste(fname, lname)
}

my_function("Peter")

قيمة المعلمة الافتراضية

يوضح المثال التالي كيفية استخدام قيمة معلمة افتراضية.

إذا استدعينا الدالة بدون وسيطة ، فإنها تستخدم القيمة الافتراضية:

مثال

my_function <- function(country = "Norway") {
  paste("I am from", country)
}

my_function("Sweden")
my_function("India")
my_function() # will get the default value, which is Norway
my_function("USA")

إرجاع القيم

للسماح لدالة بإرجاع نتيجة ، استخدم return()الوظيفة:

مثال

my_function <- function(x) {
  return (5 * x)
}

print(my_function(3))
print(my_function(5))
print(my_function(9))

ناتج الكود أعلاه سيكون:

[1] 15
[1] 25
[1] 45

وظائف متداخلة

توجد طريقتان لإنشاء دالة متداخلة:

  • استدعاء وظيفة داخل وظيفة أخرى.
  • اكتب دالة داخل دالة.

مثال

استدعاء وظيفة داخل وظيفة أخرى:

Nested_function <- function(x, y) {
  a <- x + y
  return(a)
}

Nested_function(Nested_function(2,2), Nested_function(3,3))

شرح المثال

تخبر الدالة x بإضافة y.

الإدخال الأول Nested_function (2،2) هو "x" للوظيفة الرئيسية.

الإدخال الثاني Nested_function (3،3) هو "y" للوظيفة الرئيسية.

إذن الخرج هو (2 + 2) + (3 + 3) = 10 .

مثال

اكتب دالة داخل دالة:

Outer_func <- function(x) {
  Inner_func <- function(y) {
    a <- x + y
    return(a)
  }
  return (Inner_func)
}
output <- Outer_func(3) # To call the Outer_func
output(5)

شرح المثال

لا يمكنك استدعاء الوظيفة مباشرة لأنه تم تعريف Inner_func (متداخل) داخل Outer_func.

نحتاج إلى استدعاء Outer_func أولاً للاتصال بـ Inner_func كخطوة ثانية.

نحتاج إلى إنشاء متغير جديد يسمى الإخراج وإعطائه قيمة ، وهي 3 هنا.

ثم نقوم بطباعة الناتج بالقيمة المرغوبة لـ "y" ، والتي في هذه الحالة هي 5.

إذن الخرج هو 8 (3 + 5).


العودية

يقبل R أيضًا تكرار الوظيفة ، مما يعني أن الوظيفة المحددة يمكنها استدعاء نفسها.

التكرار هو مفهوم رياضي وبرمجي شائع. هذا يعني أن الوظيفة تستدعي نفسها. هذا له فائدة بمعنى أنه يمكنك تكرار البيانات للوصول إلى نتيجة.

يجب أن يكون المطور حريصًا جدًا في التعامل مع العودية حيث يمكن أن يكون من السهل جدًا الانزلاق إلى كتابة وظيفة لا تنتهي أبدًا ، أو وظيفة تستخدم كميات زائدة من الذاكرة أو طاقة المعالج. ومع ذلك ، عند كتابتها بشكل صحيح ، يمكن أن تكون العودية طريقة فعالة للغاية وأنيقة من الناحية الحسابية للبرمجة.

في هذا المثال ، tri_recursion()هي وظيفة حددناها لتسمي نفسها ("recurse"). نستخدم kالمتغير على أنه البيانات التي تنخفض ( -1) في كل مرة نتكرر فيها. ينتهي العودية عندما لا يكون الشرط أكبر من 0 (أي عندما يكون 0).

بالنسبة للمطور الجديد ، قد يستغرق الأمر بعض الوقت لمعرفة كيفية عمل ذلك بالضبط ، وأفضل طريقة لمعرفة ذلك هي اختباره وتعديله.

مثال

tri_recursion <- function(k) {
  if (k > 0) {
    result <- k + tri_recursion(k - 1)
    print(result)
  } else {
    result = 0
    return(result)
  }
}
tri_recursion(6)