专栏首页医学生物信息学R语言基础教程——第六章:函数

R语言基础教程——第六章:函数

前面一直提到函数,但是并没有说R中的函数是什么,这一章就讲解函数。

一个函数是组合在一起以执行特定任务的一组语句。R具有大量内置函数,当然用户也可以创建自己的功能。

在R中,函数是一个对象,所以R解释器能够将控制传递给函数,以将参数传递函数完成操作。该函数又执行其任务并将控制权返回给解释器以及可存储在其他对象中的任何结果。

R语言的各种包或第三方包中提供了大量的函数帮助我们解决实际中的各种问题。有时,我们还需要自己编写函数来实现自己的实际需求。

函数定义

使用关键字function来创建一个R函数。R函数定义的基本语法如下:

function_name <- function(arg_1, arg_2, ...) {
   Function body 
}

函数组件函数中有许多不同的部分,它们是:

函数名称 - 这是函数的实际名称。它以R名称作为对象存储在R环境中。

参数 - 参数是一个占位符。调用函数时,将值传递给参数。参数是可选的; 也就是说,函数可能不包含参数。参数也可以有默认值。

函数体 - 函数体包含一组语句,用于定义函数的作用。

返回值 - 函数的返回值是要评估/计算的函数体中的最后一个表达式。

R具有许多内置函数,可以直接在程序中调用,而不必定义它们。我们还可以创建和使用自己创建的函数,称为用户定义函数。

内置函数

内置函数的简单示例有:seq(),mean(),max(),sum(x)和paste(...)等。它们可在用户编写的程序直接调用。

> print("www.bioinfocloud.cn")
[1] "www.bioinfocloud.cn"
> num = c(1:100)
> numsum = sum(num)
> numsum
[1] 5050

用户自定义函数

我们可以在R中创建用户定义的函数。它们用于实现用户想要的功能,当创建了这些用户自定义函数后,就可以像内置函数那样使用。以下是如何创建和使用函数的示例:

#创建一个球阶乘的函数Factorial
Factorial = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      }
     print(b) 
   }
   else {
     print("数据有误")
   }
}

调用函数

上面创建的函数Factorial,我们可以直接调用。

> Factorial(3)
[1] 6
> Factorial(4)
[1] 24
> Factorial(5)
[1] 120
> Factorial(0)
[1] "数据有误"

我们创建Factorial函数时,定义了参数a,这称为带参数函数,我们可以不定义参数,叫无参函数,比如我们只想执行打印某一语句:

printwebsite = function(){
  print("www.bioinfocloud.cn")
  print("微信公众号:bioinfo_cloud")
  }
# 直接调用就可以了
printwebsite()

上面代码运行结果为:

[1] "www.bioinfocloud.cn"
[1] "微信公众号:bioinfo_cloud"

return

学过其他编程语言的可能知道,函数返回值的问题,在R中,函数中也利用return返回值。

#创建一个球阶乘的函数Factorial
Factorial_v2 = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      }
     return(b)
   }
   else {
     print("数据有误")
   }
}

继续看上面的案例,我们将print(b)改成return(b)是一样的,不同的是我们可以将结果直接赋值给另外一个变量。

> bio = Factorial_v2(12)
> bio
[1] 479001600

函数中的变量作用范围

我们将上面Factorial函数中的打印放在for循环中,再运行试试

#创建一个球阶乘的函数Factorial
Factorial_v3 = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      print(b)
      }
     
   }
   else {
     print("数据有误")
   }
}
> Factorial_v3(5)
[1] 1
[1] 2
[1] 6
[1] 24
[1] 120
Factorial_v4 = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      }
     
   }
   else {
     print("数据有误")
   }
    print(b)
}

将打印print(b)放在if语句外,发现结果是对的。

Factorial_v4(5)
[1] 120
Factorial_v5 = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      }
     
   }
   else {
     print("数据有误")
   }
    print(b+1)
}

将print(b)改为print(b+1)好像不还是能调用。这在其他编程语言中是会报错的。

> Factorial_v5(5)
[1] 121

加入我们在函数外直接用b会怎样??

Factorial_v5 = function(a) {
   if(a>0) {
    b = 1
    for(i in 1:a){
      b <- b*i
      }
     
   }
   else {
     print("数据有误")
   }
    print(b+1)
}
print(b+1)

在函数为直接运行print(b+1)时会报错,也就是说函数内部定义的变量只在函数内有用。

> print(b+1)
Error in print(b + 1) : object 'b' not found

倘若函数外也定义了b这个变量,优先使用函数里面的b。

> b = 1314
> print(b)
[1] 1314
> Factorial_v5(6)
[1] 721

本文分享自微信公众号 - MedBioInfoCloud(MedBioInfoCloud),作者:DoubleHelix

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言数据分析与挖掘(第八章):判别分析(1)——距离判别法

    判别分析是判断个体所属类别的一种多元统计分析方法。它在医学领域有着广泛的应用,主要有疾病诊断、疾病预测和病因学分析。例如,根据病人的症状、生化指标判断病人得的是...

    DoubleHelix
  • RNA-seq的counts,RPM, RPKM, FPK值到底有什么区别?

    现在常用的基因定量方法包括:RPM, RPKM, FPKM, TPM。这些表达量的主要区别是:通过不同的标准化方法为转录本丰度提供一个数值表示,以便于后续差异分...

    DoubleHelix
  • 基因芯片数据挖掘分析表达差异基因

    基因芯片(genechip)(又称DNA芯片、生物芯片)的原型是80年代中期提出的。基因芯片的测序原理是杂交测序方法,即通过与一组已知序列的核酸探针杂交进行核酸...

    DoubleHelix
  • Python基础入门_4函数

    第四篇内容,这次介绍下函数的基本用法,包括函数的定义、参数的类型、匿名函数、变量作用域以及从模块导入函数的方法,目录如下所示:

    材ccc
  • Python基础5

    哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只...

    hankleo
  • JavaScript 模式》读书笔记(4)— 函数1

      从这篇开始,我们会用很长的章节来讨论函数,这个JavaScript中最重要,也是最基本的技能。本章中,我们会区分函数表达式与函数声明,并且还会学习到局部作用...

    zaking
  • python函数(二)

    #6.传递任意个数的参数; #在定义函数时,若参数名前面使用“”,则表示可接受任意个数的参数,这些参数保存在一个元祖中。 #定义函数,代表b是一个元祖,可以接受...

    py3study
  • Python-函数式编程介绍 (上)

    #内置函数:网址如下 https://docs.python.org/zh-cn/3.7/library/functions.html

    py3study
  • C++基础系列の函数

    前几天我们讲了一下C++中的函数,不过还有一部分没有讲完,今天我们继续讨论一下。如果你没有看过那篇文章,可以点击右边的链接前往:C++の函数

    leoay
  • 老男孩Python全栈开发(92天全)视频教程 自学笔记15

    玩蛇的胖纸

扫码关注云+社区

领取腾讯云代金券