English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

الوظائف بلغة R

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

يمكنك تقسيم الكود إلى وظائف مختلفة. كيفية تقسيم الكود إلى وظائف مختلفة يحددها أنت، ولكن من الناحية المنطقية، تقسيم عادة ما يتم بناءً على تنفيذ كل وظيفة مهمة معينة.

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

R 语言中函数是一个对象,可以拥有属性。

定义函数

R 语言中的函数定义使用 function 关键字,一般形式如下:

function_name <- function(arg_1, arg_2, ...) {
    // 函数体
}

说明:

  • function_name : 函数名

  • arg_1, arg_2, ... : 形参列表

函数返回值使用 return()。

内置函数

R 语言提供了很多有用的内置函数,我们无需定义它就可以直接使用。

例如:seq(), mean(), max(), sum(x) 以及 paste(...) 等。

# 输出 32 到 44 的所有数字
print(seq(32,44))
# 计算两个数到平均数
print(mean(25:82))
# 计算 41 到 68 所有数字之和
print(sum(41:68))

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

 [1] 32 33 34 35 36 37 38 39 40 41 42 43 44
[1] 53.5
[1] 1526

自定义函数

我们可以自己创建函数,用于特定到功能,定义后可以向内置函数一样使用它们。

下面演示两如何自定义函数:

# 定义一个函数,用于计数一个系列到平方值
new.function <- function(a) {
   for(i in 1:a) {
      b <- i^2
      print(b)
   }
}

接下来我们可以调用函数:

new.function <- function(a) {
    for(i in 1:a) {
       b <- i^2
       print(b)
    }
 }
 
# 调用函数,并传递参数
new.function(6)

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36

我们也可以创建一个不带参数的函数:

new.function <- function() {
    for(i in 1:5) {
        print(i^2)
    }
}       
 
# 调用函数,不需要传递参数
new.function()

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25

带有参数值的函数

函数参数,可以按函数创建时的顺序来传递,也可以不按顺序,但需要指定参数名:

# 创建函数
new.function <- function(a,b,c) {
   result <- a * b + c
   print(result)
}
# معاملات بدون اسم
new.function(5,3,11)
# معاملات باسم
new.function(a = 11, b = 5, c = 3)

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 26
[1] 58

يمكن أيضًا تحديد قيم افتراضية للمعاملات عند إنشاء الوظيفة، إذا لم يتم إدخال المعاملات عند الطلب، سيتم استخدام القيم الافتراضية

# إنشاء وظيفة تحتوي على معاملات افتراضية
new.function <- function(a = 3, b = 6) {
   result <- a * b
   print(result)
}
# يتم استدعاء الوظيفة، دون إدخال معاملات، سيتم استخدام القيم الافتراضية
new.function()
# يتم استدعاء الوظيفة، وإدخال المعاملات
new.function(9,5)

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 18 [1] 45

وظائف الحسابات السلسة

حسابات سلسة ستعيد تأخير العمل حتى يحتاج النظام إلى نتائج هذه الحسابات. إذا لم يتم الحاجة إلى النتائج، فإن العمل لن يتم

بشكل افتراضي، يتم حساب المعاملات في الوظائف بلغة R بشكل سلس، أي فقط عند الحاجة إلى حساب النتائج

f <- function(x) {
  10
}
f()

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 10

إذا قمت بتشغيل الكود أعلاه، لن يتم عرض خطأ، حتى لو لم يتم إدخال المعامل، لأننا لم نستخدم المعامل x في الجسم الخاص بالوظيفة، لذا لن يتم استدعاؤه ولن يتم عرض خطأ

new.function <- function(a, b) {
   print(a^2)
   print(a)
   print(b) # يتم استخدام b، لكن لم يتم إدخاله، لذا سيتم عرض خطأ
}
# يتم إدخال معامل واحد
new.function(6)

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

[1] 36
[1] 6
Error in print(b): مفقود المعامل "b" وليس هناك قيمة افتراضية
Calls: new.function -> print
توقف عن التنفيذ