将data.table链分成两行代码以便于阅读

时间:2015-11-17 16:17:20

标签: r data.table code-formatting

我正在研究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)]

当然,最后一行会导致错误。谢谢!

2 个答案:

答案 0 :(得分:16)

使用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。

答案 1 :(得分:8)

您必须在每行的[]之间进行回报。有关如何将 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