谷禾健康
统计和科学编程已迅速成为科学中的一项必要技能,而这一般都需要用到——R语言。
R语言以其简单易学、免费开源的特性,正在各个领域发挥着越来越重要的作用。
由于其强大的统计计算和数据可视化两大功能,可以说在生信领域, R语言是干活的法宝。
本文分享的是来自一些自学R语言的研究人员认为有用的技巧,希望能为已经上路的R语言的自学者,看不到清晰道路的R语言小白、以及广大想要学习R语言的生物科研人员提供一些帮助。
注意:
这10条技巧并不是提供使用 R 的技术指导,而是提供了构建或磨练 R 编程技能的实用策略。
学习 R 就是学习一门新语言,包括词汇、语法、句法,甚至可能是一种新的思维方式,打开一个新的世界。
可以这样说,学习 R 语言很困难,因为它涉及经常报错,所以这个学习的过程要做好准备,识别这些错误,并最终学习如何修复。
▸不怕犯错,永远没有完美
即使是最有经验的人,仍然会犯错误、忘记函数参数,或转向互联网搜索以刷新他们可能已完成多次的任务。
R 语言的流畅度不是永远不会收到错误消息,而是当你收到错误消息时感觉有能力修复它们(图 1)。当然,有些 bug 的发生并不是因为输入错误的代码,而是因为对函数参数或输出的误解。
虽然避免错误消息是很好的第一步,但确保脚本完成预期任务的最佳方法是:
仔细阅读文档,一次运行一行代码。
学习正确的编程实践的一个好方法是看书。书的一个优点是它们通常代表专家的声音、社区的技能,或两者兼而有之。大多数学习 R 编程的好书都包含代码示例,你可以使用这些示例来提高技能。
▸不管哪本书,都要运行代码示例并检查输出,积极分享
当书本后面没有答案时,开始或加入阅读小组会很有帮助,而且更有趣(后面第八条会讲到加入 R 社区)。与同事一起尝试练习,并利用彼此作为网络来提出问题、比较方法并通过复杂的任务进行集体思考。
教科书解决方案也定期在个人博客或网站上在线共享。在线发布自己的解决方案可以让你能够获得反馈,使整个 R 社区受益(参见第9条)。
▸专业书籍可以成为提升特定领域技能的绝佳资源
R 用户其实很幸运,你们已经拥有大量高质量的已出版书籍作为学习资源,其中包括:
RStudio 网站
( https://www.rstudio.com/resources/books/ ) 上精选的十多种书籍,以及无数其他作者由知识渊博的 R 贡献者提供。
比较推荐的 R 一些书籍包括“R for Data Science”和“Advanced R”,它们通过tidyverse介绍了 R 的现代方法(参见第5条关于风格)。
▸确立目标,按需去学
根据你学习 R 的目的,去看涵盖与你兴趣相符的,更具体主题的书可能会有所帮助。
例如,如果你打算将 R 用于高级统计,可以去看这类书,如《使用 R 的生态学中的混合效应模型和扩展》或《广义相加模型:R 简介》,每个都鼓励对核心编程和统计技能的深刻理解。
如果你想用 R 来画出高质量的 Web 图形,从而传达结果,可能会需要看《Interactive web-based data visualization with R, plotly, and shiny》,其中涵盖了先进的基于 Web 的数据可视化技术的介绍。
那么到底应该买多少本书?
应该选修哪些编程的课程?
是不是需要很大的金钱成本?
……
别担心,下一章节我们提供一些免费资源供参考。
幸运的是,许多高质量的R资源在线免费提供,涵盖了你可能所需的一切。
▸电子书,网站
例如,许多电子书在线免费提供,包括RStudio网站上的电子书。为了更快地参考,RStudio还提供了几个单页备忘单,每个备忘单都涵盖了一个特定包或编程任务的基本知识,可以作为很好的提醒。
如果你觉得看书枯燥,不容易看懂,那么也可以参考一些别的形式:
▸互动教程、视频课程、博客等
在Coursera、edX和freeCodeCamp等网站上也有许多关于R、统计和数据科学的免费课程,The Carpentries的免费培训材料,甚至YouTube和Twitch等网站上的免费视频教程。
一些地区和全球R团体,如R-Ladies和ROpenSci(更多信息请参见第8条),提供多种语言的博客文章、研讨会和资源。此处维护了R-Ladies博客列表(https://github.com/rladies/awesome-rladies-blogs); 包括Julia Silge和Danielle Navarro等。
其他精选的免费资源列表可以在inSileco博客和r-directory网站上找到。
无论是通过博客、互动教程还是视频课程,如果有一种在线方式你觉得最适合的,那么很可能会有这种方式的R资源,只需要搜索一点就可以找到。
▸对于R技术领域的更多具体培训,许多机构提供免费教程、研讨会和在线课程。
例如,魁北克生物多样性科学中心(QCBS)R研讨会系列以英语和法语提供了关于数据可视化、线性模型、多元分析等的介绍性和高级研讨会,并在其网站上免费提供PPT、代码和配套书籍。
爱丁堡大学的编程俱乐部为生态学家和环境科学家提供广泛的课程,从数据处理和统计到地理空间分析和机器学习。
EcoDataScience是一个以加州大学圣巴巴拉分校为中心的组织,提供一系列生态相关研究技术的技能分享和培训。
以上这些只是高质量学习小组的几个例子;可以与你所在的机构、公司或同事联系讨论,获得最相关或最方便的建议。
▸用“只是为了好玩”的项目来练习
如果你有时间和灵活性,一个很好的培养技能的方法就是通过“只是为了好玩”的项目来练习R。
– 想学习如何使用ShapeFile进行映射吗?
尝试制作一张你最喜欢的城市的海报,作为墙壁艺术印刷。
– 通过API抓取数据?
尝试在Spotify上找出最受欢迎的艺术家的共同品质。
– 文本分析?
尝试使用R的文本挖掘包来比较你喜爱的书籍或电视节目的情感关联。
– 定制数据可视化?
尝试使用ggplot形状和美学来复制你最喜爱的艺术作品(参见Twitter上的#RecreationThurday)。
▸ 低风险环境更解压
仅仅为了好玩,项目可以成为培养关键技能的非常有价值的环境。
低风险的环境会减轻你成功的压力,但当你成功时,会给你新的产品和工作代码,供你下次尝试类似的任务时参考。
▸ 用各种活动,趣味竞赛的方式边玩边学
参与有趣的社区活动、Twitter挑战或R编码竞赛(更多信息,请第8和9条)将帮你建立坚实的基础,为你的编程道路打开大门,同时选择你喜欢的项目。
如果你更愿意让你的R学习更多的“任务”工作,你可以对现有的项目进行低压力的增加,从而获得新的技能。
尝试通过向现有图添加自定义文本注释来练习HTML呈现,或者通过创建用于交互式数据探索的闪亮应用程序,来升级日常工作流程。
在改进现有工作的同时,寻找扩大技能的机会将有助于你成为更全面的R用户。
培养和维护项目的编程方法和组织系统有助于你和他人的代码清晰一致。
▸ 在开始编程项目时,需要考虑你的心态
如果在开始新任务时对所有未来步骤都进行了精心规划,那么你就可能会从使用虚拟程序代码开始项目中获益。
*虚拟程序代码是计划完成的操作的简单语言描述列表,在文档中写出,然后逐行翻译为代码。
这种方法的一个好处是,它允许你从头到尾对项目进行概念化,并为你将要编写的每一行代码提供一个离散的目标。
如果说,你更喜欢边做边学,可能更喜欢直接编写代码,观察每一行的输出,并在文本中注释最后一行完成的内容,以较小的增量达到最终目标。
在这两种情况下,对代码进行注释是很重要的,确保将来能够理解当前的想法。
▸ 接下来,需要决定在编码时使用什么样式
在本文中,编程风格是编写代码时使用的特定函数、包和语法策略的集合。如果你认为R是一种语言,可能会认为你的风格是一种方言;两种风格看起来可能不同,但它们的含义是相同的。
在R中,主要的样式划分通常围绕着:你是使用基本R的典型样式,还是采用R的管道方法以及其他tidyverse原则。
3 种代码样式的示例
虽然这些样式并不相互排斥,但它们包含不同的函数集,通常适合不同的语法策略来构造代码。根据你的背景,你可能更喜欢其中一种语法。
例如,如果有在C++或Java等程序中编写代码的经验,则顺序或嵌套语法可能会让你熟悉,而管道函数可能会使代码读起来更类似于用英语编写的句子。
(请参阅tidyverse样式指南:https://style.tidyverse.org/)
在大多数情况下,只要适合你的,什么样式都可以。
当然,匹配协作者中最常见的代码风格或规程中的标准,对阅读、共享和排除代码故障很有帮助。
有时,可能需要切换样式,以便于最好地完成某项任务,但选择尽可能保持样式一致将有助于确保你和其他人可以解释代码。
▸ 最后,将文件放入严格的目录结构中非常重要
R生态系统提供了许多工具来促进项目组织。大多数集成开发环境(IDE)都有“项目目录”的概念;这对于领先的R IDE、RStudio和大多数其他(例如,VScode和Atom)都是如此。
还可以使用包来简化项目目录中的文件路径命名方案。根据你所在的领域,文件夹组织结构可能会有所不同,但随着项目列表的增长,对系统进行批判性思考将简化生活。
此外,保持适当的项目组织将有助于你学习“版本控制”的实践,这是一种跟踪更改和备份代码的系统,正在成为跨科学领域的专业标准。
R的大多数功能都捆绑在特定于任务的包中,但很难知道哪些包存在,哪些包最适用于某些任务。
在R中,用户开发包的主要存储库是CRAN,即the Comprehensive R Archive Network,综合R存档网络。
虽然软件包也可以来自其他来源,但CRAN软件包具有通过R’s install.packages功能轻松访问,确保软件包已在多个平台上测试的优势。
当搜索完成特定任务所需的新包时,最好从CRAN的任务视图开始(https://cran.r-project.org/web/views/).
任务视图允许用户按主题浏览已发布的包,包括多元统计、时空分析、元分析等。任务视图浏览器列出每个主题的相关包,并提供指向每个特色包的扩展文档的链接。
该资源对于R初学者以及正在寻找应对新挑战的方法的更有经验的R用户非常有用。
自学R时,你可能会遇到自己还不知道如何解决的问题。
在这些情况下,寻求帮助可能会为你节省大量时间,缓解头痛。
知道如何以有针对性的方式寻求帮助,这样你就能够查明问题的根源,并且在理想情况下,帮你避免将来出现类似问题。
▸ 如何以有针对性的方式寻求帮助?
当你第一次遇到问题时,复制和粘贴遇到的错误到搜索引擎中,可能会让你访问Stack Overflow、GitHub或R-bloggers等网站。
-通常情况下,有人会遇到与你相同的问题,并且可能会找到你可以使用的解决方案。
-如果没有的话,你可能需要发布自己的求助。
在这种情况下,有一些指导原则可以使帖子更高效:
在寻求帮助时,可复制的示例至关重要。你的目标应该是尽可能少地展示你的问题,并且在发布你的问题之前需要花一些时间隔离有问题的代码。
最有用的方法是在示例中生成一个玩具数据集,或者使用内置于R中的数据集(请参阅R中的data),并逐步删除代码中与要解决的问题无关的部分。
还应该在最小可复制示例中附带有关R会话和相关包版本的信息。所有这些步骤都可以通过reprex软件包实现。
▸ 水平提高后,帮助他人
随着技能的提高,你可能会发现自己处于一个可以帮助他人的位置。
在Twitter或Stack Overflow这样的地方回答问题是回馈R社区的好方法。
你甚至可以回过头来回答你自己过去问过的问题,这样你的帖子标记为“已解决”,并为下一个遇到同样问题的人留下一个有效的解决方案,帮助自己的同时也能给他人带来便利。
建立R语言流利性的最佳方法之一是与他人一起学习。
R社区充满活力,为学习R技能举办了会议、聚会和定期在线活动。
一个很好的起点是寻找你所在的区域的R用户或建立兴趣小组,经常举办技能分享、讲座、编程实践会议。
当然,你也可以虚拟加入R社区。The R for Data Science(R4DS)社区为学习者和导师提供了分享研究技能和协作的空间。R4DS Slack频道拥有超过10000名成员,成员可以通过讨论频道寻求帮助、分享胜利、网络等。
如果你不属于任何特定群体,R社区在许多社交网络上也很活跃。
R通常在Twitter上与#RStats标签讨论如下图。
一些常见科学编程语言的Twitter讨论流行度
社区的一个很好的切入点可能是以下帐户:
@rstudio、@Rbloggers、@icymi_r、@RLadiesGlobal、@R4DS、@rOpenSci
在Facebook和Reddit等网站上也存在一般和特定领域的R组。你甚至可以参加在线活动,如Twitch上的数据科学节目“切片”,观看专家们在R编程挑战(以及其他语言)中的竞争。
关注多产的R博客也是了解R的好方法;一些推荐的R博客作者包括Maëlle Salmon、Jacqueline Nolis、Miles McBain。
在线找到社区都是了解新功能、了解最新软件包、遇到其他地方可能看不到的提示和技巧的好方法。
最重要的是,保持积极性,继续编写代码。
R的开源文化为代码共享提供了丰富的资源。
▸ 阅读和运行来自公开来源的代码,对于发现新函数、优化处理速度和向专家学习非常有价值
一些R项目,如#TidyTuesday R社交数据可视化项目,鼓励在线代码共享,以帮助用户获得和磨练技能。
其他活动,如每年一度的RStudio Shiny竞赛,为用户制造的R产品提供了一个友好竞争的渠道,最终免费提供代码,允许用户阅读、下载和复制获奖应用程序。
如果你发现一个特别好的R产品提供了代码,请自己逐行运行代码,以了解每一行或函数的确切意思,具体起到什么作用。你可能会学到一个新的功能,可以应用于自己的项目,或者有许多方法可以完成相同的任务。
▸ 已发表的论文提供了另一个R代码源代码,以实现更多以研究为中心的目的
现在,许多学术期刊要求出版物中包含公开可用的数据和代码,其中许多(尤其是自然科学领域)都是用R编写的。通过从已发表的文献中下载材料,你可以了解所在领域的专家如何进行分析,使用哪些软件包,以及他们如何组织代码。
▸ 学会分享:在线共享你的R代码
当然,代码共享是双向的;除了从其他人那里获取公开可用的材料,您还应分享您自己的材料。
代码共享的通用平台包括GitHub、GitLab和开放科学框架(OSF)。
在线共享你的R代码将进一步增强R社区的开放性,并帮助你成为一名更加专注的代码编写者。
发布代码可能会让人感到害怕,但请记住,对科学界来说,可用代码总是比不可用代码更有价值。
如果你的代码没有完全优化或完全干净,不要过分在意。如果它能运行起来,可能会教给别人一些新的东西,是值得分享的。
R是一个非常棒的工具,可以用于统计、数据操作、可视化等,但它不一定是编程旅程的终点。
▸ 流利的R语言帮你获得未来适用于其他程序、语言或领域的技能
例如,为Shiny Applications设计用户界面(ui)将帮助你建立前端web开发的基础,R的各种文本插件(例如ggtext包)将帮助你练习HTML语法,R的向量操作(apply和purrr::map函数族)将构建概念框架以转移到其他编程语言,如Julia或Python。
▸ 这是双向的:如果你已经掌握了其他编程语言的技能,它们也会帮助你学习R语言
当你继续将编程技能应用于更广泛的任务时,你可能会发现对于某些任务,不同的工具会更有效或更合适。
在这些情况下,你在学习R时建立的信心和技能可能是下一次编程努力的有用跳板。
通过学习R获得的知识,以及你通过自学获得的经验,将使你受益远远超过你手头的任务。
学习R语言,可能是一个充满挫折、自我怀疑和缺乏继续动力的过程。在这里列出的10条是帮助你克服挑战、掌握新技术的最佳策略,甚至可能在这一过程中获得一些乐趣。
也希望可以帮助初学者,无论是研究生、业余爱好者还是渴望学习新工具的研究人员。
当然也不需要一次尝试所有这些规则,也不局限于这十条,你只需要找到最适合你的方法即可。
主要参考文献:
Lawlor J, Banville F, Forero-Muñoz N-R, Hébert K, Martínez-Lanfranco JA, Rogy P, et al. (2022) Ten simple rules for teaching yourself R. PLoS Comput Biol 18(9): e1010372. https://doi.org/10.1371/journal.pcbi.1010372