R编程中的函数类型
函数是一组编排在一起以执行特定操作的语句。函数是一个对象,因此解释器能够将控制权以及函数完成操作所需的参数传递给函数。该函数依次执行任务并将控制权以及可能存储在其他对象中的任何返回值返回给解释器。
如何定义函数?
在 R 编程中,可以使用关键字函数定义函数。在 R 中定义函数的语法如下:
Syntax:
function_name = function(arg_1, arg_2, …)
{
Function body
}
函数的各种组件/部分是:
- 函数名:是函数的实际名称。它作为具有此名称的对象存储在 R 环境中。
- 参数:参数是占位符。每当调用函数时,如果将值传递给参数。它们是可选的;也就是说,一个函数可能不包含任何参数。参数也可以有默认值。
- 函数体:它包含定义函数实际函数的所有语句集。
- 返回值:是函数成功执行任务后返回的值。更一般地说,它是函数体中要计算的最后一个表达式。
调用函数
它只不过是使用有效数量的参数调用原始函数。函数可以带参数调用,也可以不带参数调用,也可以带默认值调用。
示例:调用不带参数的函数
r
# create a function cube
# without an argument
cube <- function()
{
for(i in 1:10)
{
print(i^3)
}
}
# calling function cube without an argument
cube()
r
# create a function factorial
# with a numeric argument n
factorial <- function(n)
{
if(n==0)
{
return(1)
}
else
{
return(n * factorial(n - 2))
}
}
# calling function cube with an argument
factorial(7)
r
# create a function def_arg
# without an argument
def_arg <- function(a = 23, b = 35)
{
output <- (a + b) * a + (a - b) * b
print(output)
}
# calling function def_arg without an argument
def_arg()
# call the function with giving new values of the argument.
def_arg(16, 22)
r
typeof(sum)
typeof('[')
r
names(methods:::.BasicFunsList)
r
# R program to illustrate
# Infix function
'%Greater%' <- function(a, b)
{
if(a > b) print(a)
else if(b > a) print(b)
else print("equal")
}
5 %Greater% 7
2300 %Greater% 67
r
# R program to illustrate
# Replacement function
"replace<-" <- function(x, value)
{
x[1] = value
x
}
x = rep.int(5, 7)
replace(x) = 0L
print(x)
输出:
[1] 1
[1] 8
[1] 27
[1] 64
[1] 125
[1] 216
[1] 343
[1] 512
[1] 729
[1] 1000
示例:使用参数调用函数。
r
# create a function factorial
# with a numeric argument n
factorial <- function(n)
{
if(n==0)
{
return(1)
}
else
{
return(n * factorial(n - 2))
}
}
# calling function cube with an argument
factorial(7)
输出:
[1] 5040
示例:使用默认参数调用函数。
r
# create a function def_arg
# without an argument
def_arg <- function(a = 23, b = 35)
{
output <- (a + b) * a + (a - b) * b
print(output)
}
# calling function def_arg without an argument
def_arg()
# call the function with giving new values of the argument.
def_arg(16, 22)
输出:
[1] 914
[1] 476
函数类型
R编程中的函数主要有三类:
- 原始函数
- 中缀函数
- 替换函数
原始函数
一般来说,一个函数由三部分组成:
- 形式() ,控制你如何调用函数的参数列表。
- body() ,函数内部的代码。
- environment() ,确定函数如何查找与名称关联的值的数据结构。
每当创建函数时,形式和主体都是显式定义的,但环境是隐式指定的,具体取决于您定义函数的位置。但有一个例外,即一个函数具有三个组件,有些函数直接调用 C 代码。这些函数称为原始函数。原始函数主要存在于 C 中,而不是 R,因此它们的forms() 、 body()和environment()为 NULL。这些功能只能在基本包中找到。原始函数更难编写,但效率很高。它们有两种类型,内置类型或特殊类型。
r
typeof(sum)
typeof('[')
[1] "builtin" #> typeof(sum)
[1] "character" #> typeof('[')
示例:要在 R 控制台中打印可用原始函数的名称,请运行以下代码。
r
names(methods:::.BasicFunsList)
输出:
[1] "$" "$<-" "[" "[<-" "[[" "[[=" "cosh" "cummax" "dimnames<-"
[22] "as.raw" "log2" "tan" "dim" "as.logical" "^" "is.finite"
[29] "sinh" "log10" "as.numeric" "dim<-" "is.array" "tanpi" "gamma"
[36] "atan" "as.integer" "Arg" "signif" "cumprod" "cos" "length"
[43] "!=" "digamma" "exp" "floor" "acos" "seq.int" "abs"
[50] "length<-" "sqrt" "!" "acosh" "is.nan" "Re" "tanh"
[57] "names" "cospi" "&" "anyNA" "trunc" "cummin" "levels<-"
[64] "*" "Mod" "|" "names<-" "+" "log" "lgamma"
[71] "as.complex" "asinh" "-" "sin" "/" "as.environment" "<="
[78] "as.double" "is.infinite" "is.numeric" "rep" "round" "sinpi" "dimnames"
[85] "asin" "as.character" "%/%" "is.na" "" "Im"
[92] "%%" "trigamma" "==" "cumsum" "atanh" "sign" "ceiling"
[99] "Conj" "as.call" "log1p" "expm1" "(" ":" "="
[106] "@" "{" "~" "&&" ".C" "baseenv" "quote"
[113] "<-" "is.name" "if" "||" "attr<-" "untracemem" ".cache_class"
[120] "substitute" "interactive" "is.call" "switch" "function" "is.single" "is.null"
[127] "is.language" "is.pairlist" ".External.graphics" "globalenv" "class<-" ".Primitive" "is.logical"
[134] "enc2utf8" "UseMethod" ".subset" "proc.time" "enc2native" "repeat" "<<-"
[141] "@<-" "missing" "nargs" "isS4" ".isMethodsDispatchOn" "forceAndCall" ".primTrace"
[148] "storage.mode<-" ".Call" "unclass" "gc.time" ".subset2" "environment<-" "emptyenv"
[155] "seq_len" ".External2" "is.symbol" "class" "on.exit" "is.raw" "for"
[162] "is.complex" "list" "invisible" "is.character" "oldClass<-" "is.environment" "attributes"
[169] "break" "return" "attr" "tracemem" "next" ".Call.graphics" "standardGeneric"
[176] "is.atomic" "retracemem" "expression" "is.expression" "call" "is.object" "pos.to.env"
[183] "attributes<-" ".primUntrace" "...length" ".External" "oldClass" ".Internal" ".Fortran"
[190] "browser" "is.double" ".class2" "while" "nzchar" "is.list" "lazyLoadDBfetch"
[197] "...elt" "is.integer" "is.function" "is.recursive" "seq_along" "unlist" "as.vector"
[204] "lengths"
中缀函数
中缀函数是那些函数名称出现在其参数之间的函数,因此有两个参数。 R 带有许多内置的中缀运算符,例如:, ::, :::, $, @, ^, *, /, +, -, >, >=, <, <=, ==, ! =、!、&、&&、|、||、~、<- 和 <<- 。可以创建自己的以 % 开头和结尾的中缀函数。中缀函数的名称更灵活,因为它可以包含除 % 之外的任何字符序列。 R 编程中有一些预定义的中缀运算符。
Operators Description %% Remainder operator %/% Integer Division %*% Matrix multiplication %o% Outer Product %x% Kronecker product %in% Matching Operator
示例:创建一个具有两个参数的函数,该函数给出两个数字中的较大者,并将其绑定到以 % 开头和结尾的名称。
r
# R program to illustrate
# Infix function
'%Greater%' <- function(a, b)
{
if(a > b) print(a)
else if(b > a) print(b)
else print("equal")
}
5 %Greater% 7
2300 %Greater% 67
输出:
[1] 7
[1] 2300
替换函数
替换函数会修改它们的参数(修改 R 对象通常会创建一个副本)。替换函数的名称总是以 < 后接。它们必须具有名为 x 和 value 的参数,并返回修改后的对象。在替换的情况下,函数需要额外的参数,额外的参数应该放在 x 和 value 之间,并且必须在左侧使用额外的参数调用。必须引用函数的名称,因为它是语法上有效但非标准的名称,如果未引用,解析器会将 <- 解释为运算符而不是函数名称的一部分。
Syntax:
“function_name<-” <- function(x, additional arguments, value)
{
function body
}
例子:
r
# R program to illustrate
# Replacement function
"replace<-" <- function(x, value)
{
x[1] = value
x
}
x = rep.int(5, 7)
replace(x) = 0L
print(x)
输出:
[1] 0 5 5 5 5 5 5