学习目标
- 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)
但通常不推荐省略,因为记忆量大。此外,省略参数名使代码难于阅读,特别是包含不常用函数的时候。(当然不包括没有参数名的基础函数,如
mean
,min
等)。写上参数名就不用关心参数顺序了,尤其适用于参数较多的函数。
练习
-
mean()
也是个常用的基础函数。使用此函数计算glengths
向量的平均值。 - 从帮助文档中学习
mean()
的其他参数。
缺失值
默认情况下,包含缺失数据的向量运行的所有R函数都将返回NA。这样能确保用户知道他们缺少数据,并自行决定如何处理。当处理像平均值这样的简单统计时,忽略
NA
(缺失数据)的最简单的方法就是指定参数na.rm=TRUE
(rm
代表删除)。在某些特定情况下,有必要从向量中删除缺失值。为此,
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包,提供了各种各样的函数。要使用其他软件包,需要安装。可以从CRAN或Bioconductor存储库安装很多软件包。
(1) 从CRAN安装包
CRAN是一个存储库,除了数千个不同用户贡献的R包的源代码之外,还提供了最新的R(和旧版本)的下载地址。
可以使用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")
函数可以获取。可以尝试直接通过电子邮件发送给包的作者。
还有一些特定于主题的mailing list(GIS,系统发育等),完整列表在http://www.r-project.org/mail.html。
*本课程由Harvard Chan Bioinformatics Core (HBC)
的教学团队成员开发,中文版由简书ID@小洁忘了怎么分身(公众号@生信星球)整理。
(抱歉昨天对生物信息中心的中文翻译有误,公众号无法修改,但简书中修改了。)
微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!
我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告