【tidyverse】part4:编程

作者: 100gle | 来源:发表于2018-04-06 22:08 被阅读36次

管道操作符magrittr包

pipes:管道操作符介绍

管道操作符用%>%来表示,可以使代码更加简洁并且减少写代码的工作量,并且减少内存的占用:

  • 可以通过pryr::object_size(object)命令来查看object占用的电脑内存;
  • 虽然R由内置的object.size()函数,但是它只能每次查看单个对象,不能查看多个对象的内存占用情况

即使在别人阅读源代码时不知道%>%管道操作符的含义,也能清楚读懂每行代码起到的作用;
管道操作符表示一种「词的转译」,起到一种中介的作用;通过管道操作符将参数传递给下一个命令:

my_pipe <- function(.) {
 . <- hop(., through = forest) 
 . <- scoop(., up = field_mice)
 bop(., on = head)
} 
 my_pipe(foo_foo)
  • 其中的「.」表示参数,magrittr自动通过管道操作符替代,只要在function()内输入参数,就会自动向下传递

但是管道操作符对两类函数不起作用

  • 一类是使用当前运行环境的函数:
assign('x', 10)
x

"x" %>% assign(100)
x

由于管道操作符是一种临时环境的命令,因此无法对当前运行环境起到作用;如果想管道操作符生效;则需要用到environment()函数来创建一个环境,然后通过envir=参数来起到作用:

env <- environment()
"x" %>% assign(100)
x
  • 另一类函数是起加载作用的函数

因为在R中,所有函数的参数仅在使用到它们时才会进行计算并调用,一般不会优先调用函数;但管道操作符则会计算每一个返回的元素,因此这就会产生一种错误

不使用管道操作符的情况

虽然管道操作符是一个有用的工具,但它并不能处理所有的问题;它仅适合用于重复输入并且在一系列的命令行中才会显现它的效力;但它仍然不适用以下情况:

  • 当传递的命令行代码超过10行时

    • 为以防万一,需要创建一个名称准确的中介对象,这会使得「debugging」时容易;因为可以马上检查传递这个对象所产生的结果;这也便于检查代码
  • 当有多个输入或者输出情况时

    • 如果是存在两个或两个以上的重要对象需要合并时,最好不要使用管道操作符
  • 如果需要去构思一个复杂的图表时

    • 管道操作符是很基础线形传递,但是如果需要表达一个复杂的关系时使用到管道操作符可能会造成给阅读源代码的造成困惑

magrittr包的其他工具

tidyverse包只提供基础的管道操作符,如果需要用到其他操作符,则需要另行加载magrittr包

使用管道操作符呈现出的结果如果不在最开始进行赋值的话,是不会将结果保存在当前运行内存中的,更有可能有的函数是不会返回任何东西;

因此,如果希望某行命令即通过管道操作符传递,又能展示出结果,可以使用「T操作符」%T>%;表示返回左边命令结果

diamonds %>% 
  filter(price, carat) %T>%
  ggplot(aes(carat, price))

如果希望能用管道操作符向R中的基础函数传递参数,可以使用%$%操作符,它表示探索的意思

#报错
mtcars %>% 
  cor(disp,mpg)
  
#正确显示结果
mtcars %$% 
  cor(disp,mpg)

相关文章

网友评论

本文标题:【tidyverse】part4:编程

本文链接:https://www.haomeiwen.com/subject/xoxehftx.html