将 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&gt;% 进行一些中间步骤(使用 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 以提高可读性?

是否可以用 AStyle 将 `case xx : ` 分成两行?

如何将 MySql 列名转换为小写以提高可读性?

调整页面大小时,单选按钮分成两行

是否有任何包或方法可以将 data.table R 代码转换/发送为 sql 查询以发送到数据库?