R基础函数的编写

R官方入门教程(10)自定义函数 R是一门著名的可用于数据和统计分析的程序语言,本文翻译自R软件官方文档教程,仅供学习和参考。 阅读详情

函数的编写

因为不是豆瓣用户,这篇文章来自https://www.douban.com/note/279077707/
豆瓣用户:盐池里的萝卜。。。的

R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。



   函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。 对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。

   R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。

1. 函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。
2. 函数声明,包括 <- function, 即声明该对象的类型为函数。
3. 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。
4. 函数体
常常包括三部分.
(1). 异常处理
输入的数据不能满足函数计算的要求,或者类型不符, 这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。 错误又分为两种。
第一种, 如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时, 此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经 进行了相应的转换。
第二种,数据完全不符合要求,这种情况下,就 要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在 使用函数的情况先才不至于茫然。
(2). 运算过程
包括具体的运算步骤。 运算过程和该函数要完成的功能有关。
R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。
运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。

例子1
## if与条件判断
fun.test <- function(a, b, method = "add"){
    if(method == "add") { ## 如果if或者for/while;
        res <- a + b ## 等后面的语句只有一行,则无需使用花括号。
}
    if(method == "subtract"){
        res <- a - b
    }
    return(res) ## 返回值
}
### 检验结果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")
 
for循环有些时候是必须要用到的,for循环内部,往往需要用下标,访问数据内的一定元素,例如向量内的元素,这时候用方括号表示。一维的数据组合,或者数组,常常称为向量。二维的数据组合,往往称为矩阵,或者数据框。具体的访问方式主要是方括号内部有没有逗号的区别。for循环或者while循环有时候让人觉得比较困惑,可能需要专门的时间进行讲解。

例2
### for循环与算法
test.sum <- function(x)
{
    res <- 0 ### 设置初始值,在第一次循环的时候使用
    for(i in 1:length(x)){
        res <- res + x[i] ## 这部分是算法的核心,
##总是总右面开始计算,结果存到左边的对象
    }
    return(res)
}
 

### 检验函数
a <- c(1,2,1,6,1,8,9,8)
test.sum(a)
sum(a)
 
无论是什么样的函数,算法才是最关键的。往往需要巧妙得设计算法,让函数快捷高效。

(3). 返回值。
返回值就是函数给出的结果。打个比方,编写一个函数,就像自己攒一个机器,例如现在攒好 一台豆浆机,该豆浆机要求输入大豆,输入的大豆就是参数, 返回的结果,就是豆浆。如果该豆浆机需要不停地输入大豆, 而不能产出豆浆,这样的机器就一定会被扔掉。函数也是一样的, 需要给出返回值。 R中默认的情况是将最后一句作为返回值。但是为了函数的可读性起见,应该尽量指名返回值。返回值用return()函数给出。 函数在内部处理过程中,一旦遇到return(),就会终止运行, 将return()内的数据作为函数处理的结果给出。
下面举例说明R函数的编写方法。

例3 计算标准差
sd2 <- function(x)
{
   # 异常处理,当输入的数据不是数值类型时报错
   if(!is.numeric(x)){
      stop("the input data must be numeric!\n")
   }
   # 异常处理,当仅输入一个数据的时候,告知不能计算标准差
   if(length(x) == 1){
      stop("can not compute sd for one number,
           a numeric vector required.\n")
   }
   ## 初始化一个临时向量,保存循环的结果,
   ## 求每个值与平均值的平方
   x2 <- c()
   ## 求该向量的平均值
   meanx <- mean(x)
   ## 循环
   for(i in 1:length(x)){
       xn <- x[i] - meanx
       x2[i] <- xn^2
   }
      ## 求总平方和
   sum2 <- sum(x2)
   # 计算标准差
   sd <- sqrt(sum2/(length(x)-1))
   # 返回值
   return(sd)
}
 
## 程序的检验
## 正常的情况
sd2(c(2,6,4,9,12))
## 一个数值的情况
sd2(3)
## 输入数据不为数值类型时
sd2(c("1", "2"))
 
这样,一个完整的函数就编写完成了。当然,实际情况下,函数往往更为复杂,可能要上百行。但是好的编程人员往往将复杂的函数编写成小的函数。以便于程序的修改和维护,即使其中出现错误,也很好修改。
再有就是编写R函数时一定要注意缩进,编辑器用Notepad++, TinnR, Rstudio等,同时用等距字体(如Consolas, Courier new等)和语法高亮显示。这样便于快速寻找到其中的错误。
R语言笔记7:functions——编写函数所需的基础知识 上一讲通过三个简单的例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数的知识。 Functions in R 主要分三个部分来讲解函数: 编写函数所需的基础知识 相关语法作用域 R语言作用域的规则 编写函数所需的基础知识 R语言通过function()指令来命名和创建函数。首先要给函数赋值,也就是命名,然后在小括号中写入参数,最后再大括号中写入函数要执行的... 阅读详情

相关推荐

R语言基础之R语言入门

R语言最初是由新西兰奥克兰大学统计系的教授Ross Ihaka和Robert Gentleman在S语言基础上开发完成的。是一门解释性语言。在我看来R语言是一门数学性极强的语言,或者说这是一门为数学而生的语言,因为其具有极其出色的计算与统计分析能力...

weixin_46912400的博客 5万+

R语言函数

R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。    函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平

独奏的专栏 3109

10、 编写高效R函数:从基础到高级应用

本文详细介绍了如何在R中编写高效函数,从基础语法到高级应用技巧,包括参数设置、错误处理、动态参数传递等内容。同时,通过实际案例分析,展示了如何优化函数性能以及在数据处理中的具体应用。

weixin_35734408的博客 85

r语言提取cvs数据_R语言 第3章 R语言常用的数据管理(9)

###计算标准差sd2function(x)}{ #异常处理,当输入的数据不是数值型时报错if(!is.numeric(x)){stop(“the input data must be numeric!\n”)}#异常处理,当仅输入一个数据时,告知不能计算标准差if(length(x)==1){stop(“can not compute sd for one number,a numer...

weixin_39614011的博客 3264

2、R语言函数教程:从基础到高级应用

本博客是一篇关于R语言函数的详细教程,从基础语法到高级应用进行全面讲解。内容涵盖函数定义与调用、参数传递机制、环境与变量作用域、嵌套函数的使用等核心概念,并结合代码示例和练习帮助读者深入理解。适合初学者和希望提升R语言编程能力的开发者阅读,旨在提高代码质量和程序可维护性。

e4f5g6h7的博客 58

时间序列分析 R语言原版

用以学习时间序列分析,书中有相应的R程序,以易于理解的方式讲述了时间序列模型及其应用,内容包括趋势、平稳时间序列模型、非平稳时间序列模型、模型识别、模型诊断、预测等等

R语言 | 编写自己的函数

详细介绍了在R语言中如何编写函数。

天下弈星~的博客 5182

如果使用ssms连接SQLserver的时候出现无法连接到服务器。

如果使用ssms连接SQLserver的时候出现无法连接到服务器。 Lan 2020-03-29 22:11 329 人阅读 0 条评论 标题: 连接到服务器------------------------------无法连接到...

Vastsa的博客 1万+

R函数编写基础

编写函数: 第一部分: 1 print("str")##打印函数,打印出字符内容 2 sprintf("hello,%s","yjz")##%s是占位符,。 3 函数参数以及函数调用: hello.persion {     print(sprintf("hello %s %s",first,last)) } 4 缺省参数 hello.persion {     print

yjz_sdau的博客 3555

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 406

浅谈声发射振动复合传感器

浅谈声发射振动复合传感器 随着全球经济和自动化工业的迅速发展,人们对设备故障特别是轴承类的故障诊断也日益重视起来了。 为满足客户对旋转仪器轴承异常的精准诊断,单一的依靠振动信号或声信号分析,是很难兼顾轴承的多种异常情况的。 为此,市面上开始着手研发出了可同时分析机械设备的振动信号和声信号的复合型传感器。 初期的复合型传感器主要有 2 种类型,下面以 A、B 来举例说明。 A 型是在被测物表面不同的 2 个位置分别放置声发射(AE)传感器和加速度(ACC)传感器,它虽能一定程度...

pxtech的博客 1152

[R]在dplyr函数的基础上编写函数-(3)tidyeval

dplyr的优点很明显,数据框操作简洁,如filter(df, x == 1, y == 2, z == 3)等于df[df$x == 1 & df$y ==2 & df$z == 3, ]。然而优点也是缺点,因为它的的参数不是透明的,这意味着你不能用一个看似等价的对象代替一个在别处定义的值。 df <- tibble(x = 1:3, y = 3:1) filte...

weixin_30872733的博客 341

科研ABC - The Results Section(SCI论文写作补充)

1 前言 1.1 IMRD格式 1.2 Results部分意义 1.3 Results部分主要内容 2 Results & Discussion关系 2.1 Results & Discussion部分的搭配方式 2.2 Results & Discussion部分的区分 3 Results部分的结构 3.1 Move 1: Set the Stage 3.1....

洋洋洋2020的blog 1621

[R]在dplyr基础上编写函数-(2)substitute和quote

关于这两个函数,官方是这么定义的: substitute returns the parse tree for the (unevaluated) expression expr, substituting any variables bound in env. quote simply returns its argument. The argument is not evalu...

weixin_30872733的博客 527

闲人闲谈PS之一项目库存跨公司业务STO解决方案--SAP闲人的开篇

写这篇文章之前,简单说一下发这篇文章的动机。也算是在SAP这一行干了快10多年,在对一个模块了解越来越深入,越发觉自己的SAP知识浅薄。总的来说,和多数顾问一样,对于**标准功能**的应用业务场景理解还是存在或多或少的知识盲区。 因为一个偶然,看到SAP团子君的文章,分享了很多干货文章。这也是自己一直想做的时候,不管水平高低与否,分享本身就意味着提升。好了废话不多说,先在优快云上发一篇吧,困惑自己将近10年的问题的解决方案。 业务场景:在项目型企业中,通常会有这样的业务,母公司和客...

SAP闲人的博客 9267

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 458

[R]在dplyr基础上编写函数-(1)eval

tidyverse系列的R包虽然解放了大家的双手,但同时也束缚了我们重新编写函数的能力。在这一套语法中,要实现作为函数参数的字符串和变量之间的相互转换困难重重,但只要掌握了其中原理后,也就能够游刃有余地处理了。 首先要理解基础R中几个重要又易忽略的函数。 eval Evaluate an (Unevaluated) Expression: Evaluate an R expressio...

weixin_30872733的博客 231

向量数据库:PGVector

PGVector 是一个基于 PostgreSQL 的扩展插件,为用户提供了一套强大的向量存储和查询的功能

m0_37559973的博客 1万+

如何编写R函数

转载自http://blog.sciencenet.cn/blog-255662-501317.html

hsdcc217的博客 2614

《S32系列芯片——Boot & HSE详解》持续更新中...

专栏总目录,将详细介绍S32系列芯片的Boot功能,最终给出HSE基于IVT的Secure Boot方案!!!

车载系统攻城狮 4385

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

r语言函数matlab,R语言怎么写函数?

幕布斯5086720R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求...

weixin_33224795的博客 417

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

R语言基础语法与核心知识

R语言基础语法与核心知识的系统化梳理,适合从零开始学习。内容涵盖语法基础、数据结构、流程控制、函数编写、数据处理和可视化,帮你入门生信分析。

m0_59786934的博客 785

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

R语言基础(用最简单的方式了解学习R语言)

心灵导语:沮丧的感觉是由大脑的懒造成的,它在提示你放弃做这么难的事情,去找些容易或有趣的事情来做。 学习编程也一样,大脑越是感到沮丧,你越应该鞭策自己去战胜沮丧。认识到这一点之后,在学习编程的过程中,如果遇到了令人沮丧的难题,要乐观积极地对待这样的感觉:因为你是在挑战自我。如果每天都能挑战自己一点点,可以预见,不用多久你就会成为一名信心满满的程序员。 R和RStudio安装包下载地址——>点这里下载 学习R语言目的: 学习如何加载数据,组合与拆解数据对象,玩转R的系统环境,编写自己的R函数,以及使用

sjjsaaaa的博客 5486

编写一个函数求向量x中元素的平均值、最大值、最小值、均方根值。_【R基础】数据结构学习之向量...

点击上方「蓝字」关注我们如下图所示,在R中主要包括这五种存储结构的对象类型,分别是向量、矩阵、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同,我们首先从向量开始,来逐个探究每一种数据结构的用法。R中的数据结构标量 标量是只含有一个元素的向量,比如a 向量赋值 如果你打算建立一个名为x的向量[1],相应的分量是1,2,3...

weixin_39639286的博客 4153

R语言入门学习笔记(一)

R语言是一门主要用于数据分析的编程语言。在诸多领域都有着广泛的应用,R语言的传统强项是建模与作图,其宗旨是为了帮助科学家解决数据分析的相关问题。这里的R语言入门学习笔记系列,想要为自己梳理R学习道路上重要的知识点,并且希望能够帮助到所有想要系统学习R的初学者们。这个部分是通过学习《R语言入门与实践》这本书所获得的部分心得,想要学习的朋友可以去自行阅读此书。有时你可能会想要重复使用某段代码,可以利用复制粘贴进行修改重复使用。

weixin_72071150的博客 1285

R基础学习

R程序包 在CRAN 提供了每个包的源代码和编译好的程序包 以vegan包为例,CRAN提供了: Package source: vegan_1.17-2.tar.gz MacOS X binary: vegan_1.17-2.tgz Windows binary: vegan_1.17-2.zip Reference manual: vegan.pdf Window下程序包为zip...

LiuHuan_study的博客 3368
上一篇: 时间序列笔记(七)
下一篇: GNMF其中一步的matble程序详解
zhmjunjun
博客等级 码龄10年 38粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值