搜索
查看: 723|回复: 0

[R] 第十三章 这可能是个joke。。。

[复制链接]

31

主题

36

帖子

1212

积分

金牌会员

Rank: 6Rank: 6

积分
1212
发表于 2018-10-22 22:45:09 | 显示全部楼层 |阅读模式
# foo_foo 代码,死活运行不了,查了一下,发现可能是个joke。。。。。
这可能是个joke.png
[AppleScript] 纯文本查看 复制代码
library(magrittr)

foo_foo <-  little_bunny()

#中间步骤
foo_foo_1 <- hop(foo_foo,through = forest)
foo_foo_2 <- scoop(foo_foo_1,up = field_mice)
foo_foo_3 <- bop(foo_foo_2,on = head)

# 最大的缺点就是繁琐,需要为每一个中间结果建立一个变量,当变量没有实际意义时
# 这个过程就非常的麻烦、耗时,同时及其容易出错

# 代码创建的多个数据副本并不会占用大量内存
[AppleScript] 纯文本查看 复制代码
diamonds <- ggplot2::diamonds

diamonds2 <- diamonds %>% 

  dplyr::mutate(price_per_carat = price / carat)


# 使用前,先安装加载pryr包
# pryr:bject_size()返回所有参数占用的内存,以下三行运行的结果十分有趣

[AppleScript] 纯文本查看 复制代码
pryr::object_size(diamonds)

pryr::object_size(diamonds2)

pryr::object_size(diamonds,diamonds2)

内存占用情况 1.png

# 公用变量只有在修改时才会进行复制,才会占用更多的空间,以下代码进行展示

[AppleScript] 纯文本查看 复制代码
diamonds$carat[1] <- NA

pryr::object_size(diamonds)

pryr::object_size(diamonds2)

pryr::object_size(diamonds,diamonds2)

修改变量后 内存占用情况 2.png

# 内置object_size()只能接受一个参数,无法计算在多个对象间公用数据的空间

# 重写初始对象

[AppleScript] 纯文本查看 复制代码
foo_foo <- hop(foo_foo,through = forest)

foo_foo <- scoop(foo_foo,up = field_mice)

foo_foo <- bop(foo_foo,on = head)


# 虽然省去了建立变量的繁琐,但是调试起来太痛苦,一旦出错,必须从头开始运行

# 函数组合
# 优点:避免赋值语句

[AppleScript] 纯文本查看 复制代码
bop(

  scoop(

    hop(foo_foo,through = forest),

    up = field_mice

  ),

  on = head

)


# 缺点:必须按照从内向外和从右向左的顺序阅读代码,而且参数太分散

# 管道

[AppleScript] 纯文本查看 复制代码
foo_foo %>%

  hop(through = forest) %>%

  scoop(up = field_mice) %>%

  bop(on = head)


# 简洁&便捷

# 管道的原理:词法变换

[AppleScript] 纯文本查看 复制代码
my_pipe <- function(.){

  . <- hop(.,through = forest)

  . <- scoop(.,up = field_mice)

  bop(.,on = head)

}

my_pipe(foo_foo)


# 意味着管道不能支持两类函数
# 1、使用当前环境的函数
# 例如,assign()会在当前环境中使用给定名称创建一个新变量。
# get()和load()也存在这个问题

[AppleScript] 纯文本查看 复制代码
assign("x",10)

x

"x" %>% assign(100)

x


# 如想使用管道,必须在由 %>% 建立的一个临时环境中进行

[AppleScript] 纯文本查看 复制代码
env <- environment()

"x" %>% assign(100,envir = env)

x


# 2、使用惰性求值的函数
# 惰性求值的含义——表达式不在它被绑定到变量之后就立即求值,
# 而是在该值被取用的时候求值
# 另外相似的函数还包括 try()、suppressMessages()和suppressWarnings()

[AppleScript] 纯文本查看 复制代码
tryCatch(stop("!"),error = function(e)"An error")



stop("!") %>%

  tryCatch(stop("!"),error = function(e)"An error")

惰性函数 示例.png
# 不适合使用管道的情形
#1 操作步骤10个,如何解决?使用有意义的变量来保存中间结果,
#  使调试更加容易
#2 有多个输入、输出,如何解决?别用管道(手动狗头)
#3 操作步骤构成一张具有复杂依赖的有向图




上一篇:phasiRNA鉴定求助
下一篇:GPL16770 的注释包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-12-7 13:03 , Processed in 0.025445 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.