R编程中的函数

时间:2020-02-23 14:43:50  来源:igfitidea点击:

编程中的功能是执行特定工作的可重用代码块。
例如,如果您需要多次计算一个值列表的平均值,那么每次都为该操作添加代码很繁琐。
相反,您可以编写一个计算平均值并根据需要调用多次的函数。

R具有数百个执行数学和图形运算的内置函数。
R还允许您定义自己的自定义函数以满足您的需求。
本教程旨在帮助您了解R中编写和调用函数的规则。

R函数的组成部分

R中的功能可以通过function关键字指定。
以下是在R中编写函数的语法。

functionname <- function(argument1, argument2...){
# What you want the function to do
return(returnobject)}

  • 这里的函数名称可以是任何有效的R标识符,就像我们之前讨论的那样。

  • 参数是我们希望传递给函数的值。
    一个函数可以接受也可以不接受任何参数。

  • 该函数在其体内操纵这些参数。
    主体是括号之间的代码。

  • 函数末尾的return语句用于返回函数计算的值。
    这可以是数值,也可以是在函数体内创建或者操作的对象。

一个简单的R函数示例

现在,让我们编写一个简单的函数来了解其工作原理。

myname <- function(name){
paste("Hello",name)
} 
name <- readline()
myname(name)

在继续之前,paste()是一个内置函数,用于连接并打印两个字符串。

我们在上面创建了一个名为" myname"的函数,该函数接受一个名为name的参数。
在该函数的主体中,它会显示一条消息" Hello + name"。

该名称是使用另一个内置函数readline()从用户输入中获取的,该函数可以读取带空格的整行,直到遇到换行符为止。

最后,我们使用name参数调用该函数。
让我们看看输出如何。

输出:

> name <- readline()
Neil Armstrong
> myname(name)
[1] "Hello Neil Armstrong"

使用ctrl + enter编译功能块后,将在环境中创建一个名为functions的新部分,并其中注册函数myname。

当我们通过标准输入(键盘)为名称变量提供值" Neil Armstrong"时,该值将传递到函数中,最后在控制台上显示预期的消息" Hello Neil Armstrong"。

用返回值编写R函数

现在让我们尝试另一个函数,看看return语句如何工作。
考虑一个具有两个数字的函数,计算平均值并返回平均值。

average <-function(num1,num2){
return((num1+num2)/2)
}

此函数返回可以在调用语句中访问的计算值。
返回值存储在此处的变量c中。

a=4
b=5
c=average(a,b)
print(c)

输出:

[1] 4.5

R中的参数处理

R在函数处理中合并了惰性评估。
这意味着仅在需要时才对表达式求值。

R还支持为参数提供默认值。

myname2 <- function(name="no name"){
paste("Hello",name)
}

myname2()

与上面的myname函数类似,我们编写了myname2函数,但是我们为name变量使用了默认参数,其值为" no name"。
让我们看看不带参数调用函数时会发生什么。

> myname2()
[1] "Hello no name"
> myname2("theitroad")
[1] "Hello theitroad"

不带任何参数的函数将显示默认参数。

R还有助于使用missing关键字检查函数中缺少的参数。
下面的示例对此进行了说明。

我们想显示一条消息,说明仅提供一个数字时函数中缺少一个参数。

#Display an error message when either of the arguments is missing and return #NULL
average <-function(num1,num2){
if(missing(num1)|missing(num2)){
  print("needs two arguments for average")
  return(NULL)
}
return((num1+num2)/2)
}

现在我们使用单个参数调用average()

average(2)

输出:

> average(2)
[1] "needs two arguments for average"
NULL

当进一步编写复杂函数时,这将被证明是有用的功能。

R函数中的可变参数

R还允许函数使用变长参数列表。
您可以传递参数而无需先在参数列表中定义它们。
这是通过使用省略号或者三个点(...)完成的。
例如,可以如下定义功能。

#Ellipsis represents any number of arguments.
elfunction <-function(...){
args <- list(...)
sum <- as.integer(0)
for(i in 1:length(args)){
  sum=sum+as.integer(args[i]) 
}
print(sum)
}

现在暂时忽略for循环的结构,只需记住,它会在参数列表的整个长度上进行迭代,以累加初始值设置为0的总和。
让我们检查不同情况下的输出。

> elfunction(1,2,3,4,5)
[1] 15
> elfunction(8,6,24)
[1] 38
> elfunction(1,1,1,1,1,1,1,1,1,1,1,1,1) 
[1] 13

观察我们定义的elfunction如何接受任意数量的参数,而不必为每个参数定义一个新参数。