linux中r语言操作,【R数据科学读书笔记】R语言中的管道操作

这篇博客介绍了R语言中使用magrittr包进行管道操作的概念和优势。通过管道符号`%>%`,可以将多个数据分析步骤串联起来,使代码更易读和维护。作者提到,虽然管道操作在简单场景下非常有用,但在复杂的数据处理流程中可能需要使用有意义的中间变量。此外,博客还提到了magrittr提供的其他辅助符号,如`%$%`, `%<>%`和`%T>%`。最后,博客探讨了管道操作符的本质,揭示其内部的词法转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

R语言中的管道操作

这是R数据科学的读书笔记之一,《R数据科学》是一本教你如何用R语言进行数据分析的书。即便我使用R语言快2年多了,但是读这本书还是受益颇多。

这一篇学习笔记对应第13章:使用magrittr进行管道操作。关于管道这个概念,我最早在Linux系统中接触,它是Unix系统设计哲学的体现,“组合小功能完成大任务”,比如说BWA比对后排序用管道的写法就是

bwa mem ref 1.fq 2.fq | samtools sort > align.bam

在R语言接触管道符号"%>%"是在学习dplyr包时候,那个时候我以为这个符号是 Hadley Wickham 创造出来的,其实是来源于Stefan Milton Bache开发的magrittr中。

基础部分

在没有管道符号之前,如果我要对一个变量做一系列的分析的话,那么写法是下面这个样子

# 先创建100个随机数

nums

# 分成两列

nums_matrix

# 分别求两列的均值

nums_mean

这里面我写了很多中间变量,要多敲很多字,而且如果我要修改输入的话的100个随机数的话,我需要修改两处。当然可以进行函数嵌套.

Matrix::colMeans(matrix(rnorm(100), ncol=2))

但是这种写法不利于人的阅读,当我读到这个函数的时候,我需要先连续往大脑里塞进去两个函数后,才能抵达核心,然后再从里往外解析。

但是有了管道符号之后一切就不一样了,写法就是

rnorm(100) %>% matrix(ncol=2) %>% Matrix::colMeans()

你会发现从左往右阅读,代码读起来非常的流畅。

虽然管道看起来很美好,但是在如下的场景中就不太适合了,

操作步骤特别的多,比如说10个,那么你就需要用一些有意义的中间变量来存放中间结果,方便调试

多输入多输出。比如说A和B输入,输出C和D

操作步骤构成了一张复杂关系的有向图,比如说D结果依赖于B和C,而B和C依赖于A。

简单点说,就是类似于A > B > C > D 这种场景用管道比较好。

除了%>%这个好用的符号外,magrittr还提供了其他三个比较好用的符号,%$%,%<>%和%T>%。

高级部分

上面都是常规操作,作为有一定基础的R语言使用者,更希望探索点这个符号的本质。

首先明确一点,在R语言中一切符号本质上都是函数,比如说"+"也是一个函数,常规用法都是1 + 2, 但是我们可以用函数的方式来写哦

`+`(4,5)

# 9

因此rnorm(100) %>% matrix(ncol=2)其实应该理解成

`%>%`(rnorm(100), matrix(ncol=2))

那么我们就可以看看管道符号的源代码了

?magrittr::`%>%`

function (lhs, rhs)

{

parent

env

chain_parts

pipes

rhss

lhs

env[["_function_list"]]

pipes[[i]], parent))

env[["_fseq"]]

`_function_list`)), env, env), c("fseq", "function"))

env[["freduce"]]

if (is_placeholder(lhs)) {

env[["_fseq"]]

}

else {

env[["_lhs"]]

result

env))

if (is_compound_pipe(pipes[[1L]])) {

eval(call("

parent)

}

else {

if (result[["visible"]])

result[["value"]]

else invisible(result[["value"]])

}

}

}

这个代码的核心在于如下两行

env[["_function_list"]]

pipes[[i]], parent))

env[["_fseq"]]

`_function_list`)), env, env), c("fseq", "function"))

这两行干的活其实是进行词法转换,也就是把我们之前的管道串联起来的部分转换成

my_pipe

.

.

.

}

my_pipe(100)

多说两句

考虑到在管道里面用"+"."-"这些函数时用到`+`或许会有点诡异,于是magrittr给这些符号命名了对应的别名,如下

extract `[`

extract2 `[[`

inset `[

inset2 `[[

use_series `$`

add `+`

subtract `-`

multiply_by `*`

raise_to_power `^`

multiply_by_matrix `%*%`

divide_by `/`

divide_by_int `%/%`

mod `%%`

is_in `%in%`

and `&`

or `|`

equals `==`

is_greater_than `>`

is_weakly_greater_than `>=`

is_less_than `

is_weakly_less_than `<=`

not (`n'est pas`) `!`

set_colnames `colnames

set_rownames `rownames

set_names `names

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值