R语言R学习

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

2019-04-09  本文已影响0人  小洁忘了怎么分身

学习目标

1.函数及其参数

(1)什么是函数?

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

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

function_name(input)

input称为参数,可包括:

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)奇怪的报错

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


练习

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")

在哪里寻求帮助?

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


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

猜你喜欢

热点阅读