哈佛R语言课程--3.函数、参数和R包

学习目标

  • R语言函数的描述和应用。
  • 使用参数修改R语言函数的默认操作
  • 从R帮助文档获取有关函数的更多信息
  • 创建用户自定义函数
  • 演示如何安装外部包以扩展R的功能。
  • 查询外部资料以
    (1)处理报错
    (2)获取有关函数和包的更多信息

1.函数及其参数

(1)什么是函数?

函数是R语言的重要特征。函数是完成特定任务的“自包含”代码模块。函数通常是对某种数据结构(值,向量,数据框等)进行处理,并返回结果。

函数的一般用法是:函数名+括号

function_name(input)

input称为参数,可包括:

  • 函数执行任务的物理对象(任何数据结构)
  • 改变函数的运作方式的规则(例如options)
    并非所有函数都带参数,例如:
getwd()

但大多数函数可采用多个参数。在调用函数时未指定必需参数,则会收到error,或者函数将采用默认值

默认值表示该函数的作者认为“标准情况下足够好”的标准值,比如在图中使用哪种符号。但是,如果你想要自定义,就用你选择的值更改参数。

(2)基础函数

在前面的课程中使用过几个基础函数,例如getwd()c()factor(),它们是R内置函数的一部分,接下来探讨这些内置的基础函数。

用户还可以从外部包或库中获取函数(稍后讨论),甚至可以编写自己的函数。

复习一下将数据组合到向量中的函数c()。它所采用的参数是数字,字符或字符串的集合(以逗号分隔)。c()函数将数字或字符组合成单个向量。还可以用这个函数将元素添加到现有向量:

glengths <- c(glengths, 90) # adding at the end 
glengths <- c(30, glengths) # adding at the beginning

可以在原始向量glengths(包含三个元素)的开头或结尾添加新对象。这个操作可以反复操作,以构建向量或数据集。

R用于统计计算,因此许多基础函数涉及数学运算。比如sqrt()函数。输入/参数必须是数字,输出是该数字的平方根。比如81的平方根:

sqrt(81)

如果我们以数值向量代替单个数值作为输入,调用函数(例如运行函数)会怎么样?

sqrt(glengths)

R对glengths向量的每个值执行了计算,并输出结果。

再试试另一个函数,这次可以改变某些选项(改变函数行为的参数),例如round

round(3.14159)
#[1] 3

结果是3。那是因为默认是舍入到最接近的整数。如果想要指定有效数字位数该怎么做?

(3)寻求函数的帮助信息

输入?+函数名称。执行此操作将在RStudio右下方面板打开帮助文档,该文档包括函数的功能、用法、参数、详细信息和示例:

?round

如果熟悉该函数,只需要显示参数名称,用:

args(round)

example()函数更有用。这将允许您运行联机帮助中的示例部分,以确切了解它在执行命令时的工作方式。让我们试试round()

example("round")

在我们的示例中,我们可以通过添加参数来更改返回的位数。我们可以输入digits=2或者我们想要的许多东西:

round(3.14159, digits=2)

注意:按照函数定义的顺序(帮助文档中有)输入参数,可以省略参数名:

round(3.14159, 2)

但通常不推荐省略,因为记忆量大。此外,省略参数名使代码难于阅读,特别是包含不常用函数的时候。(当然不包括没有参数名的基础函数,如meanmin等)。写上参数名就不用关心参数顺序了,尤其适用于参数较多的函数。


练习

  1. mean()也是个常用的基础函数。使用此函数计算glengths向量的平均值。
  2. 从帮助文档中学习mean()的其他参数。

缺失值

默认情况下,包含缺失数据的向量运行的所有R函数都将返回NA。这样能确保用户知道他们缺少数据,并自行决定如何处理。当处理像平均值这样的简单统计时,忽略NA(缺失数据)的最简单的方法就是指定参数na.rm=TRUErm代表删除)。

在某些特定情况下,有必要从向量中删除缺失值。为此,na.omit函数可以移除向量中的NA。有的情况下需要保留所有观察结果,也有的情况下需要删除包含缺失值的整行结果。complete.cases()函数返回一个逻辑向量,指示哪些行没有缺失值。


2.用户定义的函数

允许用户自定义函数是R语言的一大优势。有时你需要做一个小任务(或一系列任务),发现必须多次重复某一操作。这种情况下,创建自定义函数就很有帮助。函数的结构如下

name_of_function <- function(argument1, argument2) {
    statements or code that does something
    return(something)
}

  • 首先为自己的函数命名。
  • 然后为它赋值,这里的“值”就是函数具体内容。

定义函数时,需要提供所需参数列表(用于修改函数行为的输入和选项),并在大括号中输入执行/使用这些参数的代码。参数可以是任何类型的对象(如标量,矩阵,数据集,向量,逻辑值等),并且不需要以任何方式声明。

最后,可以从函数中“return”对象的值,这意味着将其值传递到全局环境中。在函数内创建的对象是函数环境的局部对象,仅存在于函数内部,这是函数背后的一个重要思想。

注意:也可以定义一个不需要任何参数、也不返回任何结果的函数。

尝试创建一个简单的示例函数。此函数将以一个数值作为输入,返回它的平方值作为结果。

square_it <- function(x) {
    square <- x * x
    return(square)
}

现在可以使用该函数,与使用任何其他函数的方法相同。函数的名称+括号,括号内输入数值x

square_it(5)

很简单吧?在这种情况下,我们只运行了一行代码,但从理论上讲,您可以使用多行代码来获取要“返回”给用户的最终结果。在创建函数方面,只涉及到了一点皮毛!我们将在以后的课程中再次探讨这一点,如果有兴趣,也可以在R-bloggers网站上找到更多详细信息,这是square_it例子改编的来源。

3.包和库

是R函数,数据和编译代码的集合,以明确定义的格式创建,以添加特定功能。已经超过10,000个用户贡献了R包,这个数量还在不断增长。

有一组标准(或基础)软件包被视为R源代码的一部分,随R软件安装一起提供。基础包包含R的基本函数,是R运行所必须的,并对数据集标准统计和绘图的函数; 到目前为止我们在示例中使用的所有函数都属于基础包。

R中存储包的目录称为。术语有时用作同义词,社区中已有关于这个问题的讨论。使用library()函数加载包有点不符合预期,可以看看为何会引起困惑。

在控制台中输入以下代码,来检查当前R会话中加载的库:

sessionInfo() #输入R的版本信息、系统、attach或加载的R包

# OR

search() #Gives a list of attached packages

在本次课程中,我们向您介绍了标准基础包的函数。但是使用R的次数越多,就越会意识到R是个聚宝盆,收集了非常多R包,提供了各种各样的函数。要使用其他软件包,需要安装。可以从CRANBioconductor存储库安装很多软件包。

(1) 从CRAN安装包

CRAN是一个存储库,除了数千个不同用户贡献的R包的源代码之外,还提供了最新的R(和旧版本)的下载地址。

image

可以使用install.packages函数从CRAN安装R包。此函数将从CRAN镜像上下载源代码,并在您的计算机上本地安装软件包(以及依赖项)。

下面给出了稍后创建图表所需的包ggplot2的示例。运行此代码进行安装ggplot2

install.packages("ggplot2")

(2) 从Bioconductor安装包装

或者,也可以从Bioconductor安装包,Bioconductor是另一个R包存储库,提供分析和理解高通量基因组数据的工具。这些包包括(但不限于)用于统计分析,注释包和访问公共数据集的工具。

许多软件包从CRAN和Bioconductor中都可获得,也有的软件包只存放于一个存储库。可以通过Google搜索或反复尝试来查找R包的来源信息。

要从Bioconductor安装R包,首先需要安装BiocManager。BiocManager只需要安装一次。

# DO NOT RUN THIS!

install.packages("BiocManager")

然后,您可以通过在install()中输入包名(注意加引号)来安装包。在这里,我们通过Bioconductor 安装和刚才一样的ggplot2

# DO NOT RUN THIS!

library(BiocManager)
install("ggplot2")

(3)从源代码安装包

最后,R包也可以从源代码安装。当没有Internet连接(并且在本地拥有源文件)时,这种方法很有用,因为其他两种方法是从远程站点检索源文件。

要从源代码安装,也是用install.packages函数,但是添加了其他参数:

# DO NOT RUN THIS!

install.packages("~/Downloads/ggplot2_1.0.1.tar.gz", type="source", repos=NULL)

(4)加载包

安装软件包后,可以将包加载到R会话中,就可以使用该包中的任意函数,就像用基础函数一样。请注意,此处不需要引号。

library(ggplot2)

sessionInfo()或检查当前环境中加载的内容,search()应该看到您的包列为:

other attached packages:
[1] ggplot2_2.0.0

还有几个其他包也随ggplot2加载。

(5)查找某个包内的函数

第一次使用ggplot2,如何知道从哪里开始、可以使用哪些函数?一种方法是使用RStudio中的选项卡Package。如果单击选项卡,您将看到列出的所有已安装的软件包。对于已加载的包,您将在旁边的框中看到蓝色复选标记。向下滚动到列表中的ggplot2

如果已成功加载,将看到ggolot2前面的复选框,如上面的屏幕截图所示。现在,如果您单击ggplot2,RStudio将打开帮助页面,您可以滚动浏览。

另一种方法是在线查找帮助手册,这种手册有时更容易理解。例如,http://docs.ggplot2.org/current/是ggplot2更加全面的操作手册,这是谷歌搜索的结果。许多Bioconductor软件包有实用的图文教程,还提供可用的示例数据。

(6)查找函数但不知道它是哪个包

如果您正在寻找执行特定任务的函数,您可以使用help.search()但只能搜索你已安装的软件包):

help.search("scatter")

如果找不到所需内容,可以使用rdocumention.org网站搜索所有可用软件包中的帮助文件。

(7)奇怪的报错

很可能其他人已经遇到过同样的问题了!

  • 首先谷歌搜索报错消息。但不一定有用,因为通常情况下,包开发人员直接使用R自带的报错方式。最终收到的报错信息可能对诊断问题没有多大帮助(例如“subscript out of bounds”) 。

  • stackoverflow。使用[r]标签搜索。大多数问题能找到答案,但是要用对关键词:http://stackoverflow.com/questions/tagged/r


练习

ggplot2软件包是tidyverse集成软件包套件的一部分,旨在协同工作,使通用数据科学操作对用户更加友好。我们将tidyverse在以后的课程中使用该套件,所以让我们安装它注意:此套件仅存放于CRAN。


4.寻求帮助

要获得某人帮助,关键是让对方迅速理解你的问题。应该尽可能简单明了地描述问题。

(1) 要使用正确的关键词来描述你的问题。例如,包与库不同。有的人能理解你的意思,也有人会觉得有歧义。关键是,试图帮你的人可能看不懂。描述问题要尽可能精确。

(2) 始终包括sessionInfo()的输出结果,因为它提供你的平台关键信息,R的版本、正在使用的软件包,以及其他有助于理解你的问题的信息。

sessionInfo()  #This time it is not interchangeable with search()

(3) 尽量用小的data.frame 重现并描述你的问题, 不要用原来成千上万行列的数据。对你的问题进行归纳总结,有助于其他领域的人理解这个问题。
* 要将对象共享给其他人,可以将原始文件(即CSV文件)和脚本一起提交上去(并删除与问题无关的内容)。如果你处理的不是data.frame,则可以将环境中的任何R数据结构保存到文件中:

# DO NOT RUN THIS!

save(iris, file="/tmp/iris.RData")

.RData文件不能直接读取,无法直接在stackoverflow上发布。但可以通过电子邮件发送给你要求助的人:

# DO NOT RUN THIS!

some_data <- load(file="~/Downloads/iris.RData")

在哪里寻求帮助?

  • 友好的同事:你认识的比你经验丰富的人,可能并愿意帮助你。

  • Stackoverflow:如果问不到答案,就精心组织你的问题发到Stackoverflow,很可能不到5分钟就得到答案。

  • R-help:很多人(包括R核心团队的大部分人)会阅读、发布,但相当“干”(干货的干),新手不一定能看懂。如果你的问题是有效的,你可能会很快得到一个答案,但你还是不一定能看懂😢。此外,这里更强调措辞正确(否则很可能被指出措辞不当,而非得到问题答案)。如果问题是关于base包,会收到比扩展包问题更多的回复。

  • Bioconductor的支持网站。非常有用,如果你的帖子加上标签,很可能收到开发者给的答案!

  • 如果你的问题是关于扩展包的,可以先看这个包有没有mailing list。通常包含在包的DESCRIPTION文件中,用packageDescription("name-of-package")函数可以获取。可以尝试直接通过电子邮件发送给包的作者

    希望Y叔不要打我

  • 还有一些特定于主题的mailing list(GIS,系统发育等),完整列表在http://www.r-project.org/mail.html

*本课程由Harvard Chan Bioinformatics Core (HBC)
的教学团队成员开发,中文版由简书ID@小洁忘了怎么分身(公众号@生信星球)整理。
(抱歉昨天对生物信息中心的中文翻译有误,公众号无法修改,但简书中修改了。)
微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!


我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345