将 data.table 链分成两行代码以提高可读性
Posted
技术标签:
【中文标题】将 data.table 链分成两行代码以提高可读性【英文标题】:Break data.table chain into two lines of code for readability 【发布时间】:2016-02-19 02:45:55 【问题描述】:我正在处理 Rmarkdown 文档,并被告知严格限制最大列数(边距列)为 100。在文档的代码块中,我使用了许多不同的包,其中包括 data.table
。
为了遵守限制,我可以拆分链(甚至是长命令),例如:
p <- ggplot(foo,aes(bar,foo2))+
geom_line()+
stat_smooth()
bar <- sum(long_variable_name_here,
na.rm=TRUE)
foo <- bar %>%
group_by(var) %>%
summarize(var2=sum(foo2))
但我无法拆分data.table
链,因为它会产生错误。我怎样才能实现这样的目标?
bar <- foo[,.(long_name_here=sum(foo2)),by=var]
[order(-long_name_here)]
当然,最后一行会导致错误。谢谢!
【问题讨论】:
有很多方法可以做到这一点,@Jaap 指出的关键是延续您的结束]
;从那里开始,这取决于个人口味,你想如何切片和切丁
【参考方案1】:
使用 magrittr 链接 data.tables
我有一个我正在使用的方法,使用 magrittr,使用 .
对象和 [
:
library(magrittr)
library(data.table)
bar <- foo %>%
.[etcetera] %>%
.[etcetera] %>%
.[etcetera]
工作示例:
out <- data.table(expand.grid(x = 1:10,y = 1:10))
out %>%
.[,z := x*y] %>%
.[,w := x*z] %>%
.[,v := w*z]
print(out)
其他示例
编辑:它也不仅仅是语法糖,因为它允许您将上一步中的表称为.
,这意味着您可以进行自联接,
或者您可以使用%T>%
进行一些中间步骤(使用 futile.logger 等):
out %>%
.[etcetera] %>%
.[etcetera] %T>%
.[loggingstep] %>%
.[etcetera] %>%
.[., on = SOMEVARS, allow.cartesian = TRUE]
编辑:
这是很久以后的事了,我仍然经常使用它。但我有以下警告:
magrittr 增加开销
我真的很喜欢在脚本的顶层执行此操作。它有一个非常清晰易读的流程,你可以用它做很多巧妙的技巧。
但如果它是被多次调用的函数的一部分,我必须在优化之前将其删除。
在这种情况下,最好链接 data.tables the old fashioned way。
【讨论】:
【参考方案2】:您必须在每行的[
和]
之间返回。如何将 data.table 代码分成几行的示例:
bar <- foo[, .(long_name_here = sum(foo2)), by = var
][order(-long_name_here)]
您还可以在每个逗号之前/之后返回。逗号前返回的示例(我的偏好):
bar <- foo[, .(long_name_here = sum(foo2))
, by = var
][order(-long_name_here)
, long_name_2 := long_name_here * 10]
见this answer for an extended example
【讨论】:
以上是关于将 data.table 链分成两行代码以提高可读性的主要内容,如果未能解决你的问题,请参考以下文章
数据访问对象 (DAO) 是不是应该委托给其他 DAO 以提高可读性?