杜宇,EasyCharts团队成员,R语言中文社区专栏作家,对Excel商务图、R语言数据可视化、地理信息数据可视化有兴趣。个人微信官方账号:“数据立方”创始人:数据立方(微信ID: datamofang)。
在本文中,我们将与您分享如何使用R语言中的管道运算符优化代码,以及如何调用和传递管道函数的参数。
使用R语言处理数据或分析时,不可避免地要编写连续的输入输出代码。按照传统的编写方法或者习惯,初学者往往会引入大量的中间变量,或者使用函数嵌套进行一次性输出。
虽然以上两种方法在结果方面都能达到我们预期的效果,但是无论是代码效率还是内存占用都有巨大的劣势。
1.使用中介变量会增加内存开销。特别是你的原始数据非常大,内存有限。在一个进程中引入过多的中介对象,不仅会使代码冗余,还会很快透支内存。
2.使用函数嵌套避免了内存占用的问题,但是嵌套过多的函数层会使代码难以理解和阅读,甚至会给以后的项目复用带来很大的麻烦。
而R语言的领导者很早就意识到了这个问题,开始在R语言中引入流水线操作符函数不断传递参数,从而实现了内存节省和代码优化的要求。
通常使用最多的管道函数来自magrittr包,其中管道操作函数写成% >: %,是R语言中常用的函数,很多成熟的项目扩展包都有内置的管道操作函数。(例如,dplyr、rvest、传单等。都实现了默认调用)。
流水线操作符用于大多数扩展包函数,默认情况下不加载magrittr包,在使用函数之前需要加载包。
这里我们从一个小案例开始今天的解释:
库(“服务器”)
库(“stringr”)
url<。-" http://www.zyzw.com/twzs010.htm"
在最近一个关于中国世界文化遗产仪表板的案例中,我在目标网站上抓取了52个中国世界自然文化遗产的名称。
根据引入中间变量的传统方式,代码应该如下所示:
web<。-read_html(url,encoding = " GBK ")web 1 & lt;-html_nodes(web,“b”)内容& lt-html_text(web1,trim = FALSE)内容& lt-gsub("(nt|,|d|,","",content 1)content 3 & lt;-grep("S ",content2,value = T)content 4 & lt;-str_trim(content3,side="both")content5<。-content 4[1:54]content 6 & lt;-content5[setdiff(1:54,c(35,39))];内容6
其实在参数传递的细节上有很多需要注意的地方:
1.当函数只需要一个必要参数时,函数的写入容差非常高,相对自由:
样本(字母[1:5],大小=20,替换=真)% & gt% table()示例(字母[1:5],大小=20,replace = TRUE)% gt;% tablesample(字母[1:5],大小=20,replace = TRUE)% gt;% table(。)a b c d 5 7 1 7
以上三种写法都能输出正确的结果。第一种写法保留圆括号,第二种写法省略圆括号,第三种写法保留圆括号和占位符“.”。
由于table只接受一个位置参数(你也可以理解为必选参数,是一个因子或者类别变量),管道操作者从左侧传入的参数会被认为是table的必选参数。
前两种写法是等价的,第三种写法在括号里加了占位符,后面会讲到。
2.当函数有一个以上的必要参数(位置参数),并且管道函数传入的参数位于第一个时,可以用以下方式编写:
url %>;% read _ html(encoding = " GBK ")URL % & gt;% read_html(。,编码=“GBK”)
read_html函数中只有一个位置参数x(必选参数),编码是默认参数,options也是默认可选参数。所以x是强制参数,不需要声明参数名。Url是% >: %传入read_html,默认被视为x参数的对象。以上两种编写方法是等价的,第二种在read_html()函数中声明x参数的位置。(相当于x参数的占位符),但在这种情况下没有必要。(因为X是第一个位置参数,所以默认可以识别。)
3.当函数有多个位置参数(强制参数),并且从左侧传入的对象在右侧函数中没有排在第一位时,这种情况下,参数在右侧函数中的位置必须显式声明,并且" "应该用作占位符。
read_html(url,encoding="GBK") % >% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,"," ")read_html(url,encoding = " GBK ")% & gt;% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",",")read_html(url,encoding="GBK") % >;% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",","。)
在上面的代码中,前两个是错误的,最后一个成功了,因为gsub函数有三个位置参数(强制参数),我们从左侧传入的string对象正好在第三个位置参数的位置。如果没有明确声明,告诉gsub函数% >: %传入对象在右侧函数中左侧的具体位置,函数无法自动识别。
gsub(pattern,replacement,x,ignore.case = FALSE,perl = FALSE,fixed = FALSE,useBytes = FALSE)
以上三点是基于函数式编程中传递位置参数必须遵循的规则,实际上是符合现实逻辑的。通过以上三点,我们可以得出结论:
1.右侧的函数只有一个位置参数(当它是必要参数时)。可以只写函数名(不带括号),也可以用双括号写函数名,也可以写函数名+(。).以上删除照片的方法是合法的,但后两种不是必须的,功能可以根据逻辑自动识别。
2.当右函数有多个位置参数时,取决于右位置参数中从左侧导入的参数的顺序。如果恰好是右侧所有位置参数中的第一个,写的比较灵活,可以直接忽略。仅指定其他位置参数和默认参数。如果它位于第一个位置之后,则必须给出一个准确的显式位置声明和一个占位符。应该使用。
此外,当管道函数传递参数时,它还支持传递给数据帧的切片索引操作。如下图所示:
read_html(url,encoding="GBK") % >% html_nodes("b") %>。% html _ text(trim = FALSE)% & gt;% gsub("(nt|,|d|,",","。)% & gt% grep("S ",)。,值=T) % >;% str_trim(side="both") %>。% .[1:54]
在最后一次参数传递过程中,一个文本向量被传递到左侧,它可以像普通场景中的向量下标索引一样过滤观察值。此时,左向量的名称可以由占位符代替,而不是写出(。在这里是必要的)。
Magrittr包提供了很多类似的% >以保证管道功能参数传输过程更加高效。%的辅助功能:
函数名:函数符号表达式:extract `[` extract 2 `[` insert `[
以上功能包括四个操作,逻辑判断比较功能,包含关系功能等。,以及一些不常用的冷门函数。我只拿几个常见的来简单介绍一下。
库(“马格里特”)
提取函数相当于`[`,用于索引数据框中的列:
iris %>。% extract(,1:3) % >% headiris %>。% `[`(1:3) % >% headiris %>。% .[,1:3] % >% head
以上三种方法对虹膜前三列进行索引和预览,结果是等价的。
extract2函数相当于`[ `,用于索引列表中的顺序对象。
mydata<。-list( mmm=1:5,nn=c("dd "," fff "," ttt "),dd=6:20 )mydata % >% extract2(1)mydata % >% `[[`(1)mydata[[1]]mydata$mmm
1 2 3 4 5
以上四种标引方法是等价的。
好时光& lt-Sys。date()% & gt;% as。POSIXct %>。% seq(by="15分钟",length . out = 100)% & gt;% data.frame(时间戳=。)good.times $ quarter & lt-good . times % & gt;% use _ series(timestamp)% & gt;%格式(" % M ")% & gt;% as.numeric %>。% divide _ by _ int(15)% & gt;% add(1)good . times $ quarter & lt;-good . times % & gt;% .[,"时间戳"]% & gt;%格式(" % M ")% & gt;% as.numeric %>。% `%/% `(15)% & gt;% `+`(1)[1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 [61] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
以上两种方法的输出结果是等价的,特别注意最后% >: % `%/%`(15)函数,% >;% `+`(1),前者表示左边传入值的商除以15的整数部分,后者表示向量均匀增加1。
加`+`减`-`乘` * `升_到_幂`^`multiply_by_matrix `%*% `除_乘`/`除_乘_int `%/% `模` %% '
以上是浓缩的简单几何运算,可以通过函数名或符号表达式与% >结合。%传递参数,保存代码,提高效率。
至于其他尚未解释的特殊用途,如果您感兴趣,可以参考源代码文档。
本文参考文献:
https://cosx.org/2014/04/use-pipeline-operators-in-r
http://blog.fens.me/r-magrittr/
https://cran . r-project . org/web/packages/magritter/magritter . pdf
关于过去的案例数据,请转到我的GitHub:
https://github.com/ljtyduyu/DataWarehouse/tree/master/File
1.《r怎么写 如何使用管道操作符优雅的书写R语言代码》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《r怎么写 如何使用管道操作符优雅的书写R语言代码》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/823137.html