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

Pav*_*ive 5 code-formatting r data.table

我正在研究一个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))
Run Code Online (Sandbox Code Playgroud)

但我不能拆分data.table链,因为它会产生错误.我怎样才能实现这样的目标?

bar <- foo[,.(long_name_here=sum(foo2)),by=var]
           [order(-long_name_here)]
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ape 17

用magrittr链接data.tables

我有一个方法,我正在使用magrittr,使用.对象[:

library(magrittr)
library(data.table)

bar <- foo %>%
        .[etcetera] %>%
        .[etcetera] %>%
        .[etcetera]
Run Code Online (Sandbox Code Playgroud)

工作实例:

out <- data.table(expand.grid(x = 1:10,y = 1:10))
out %>% 
  .[,z := x*y] %>% 
  .[,w := x*z] %>% 
  .[,v := w*z]
print(out)
Run Code Online (Sandbox Code Playgroud)

其他例子

编辑:它也不仅仅是语法糖,因为它允许你引用上一步中的表格.,这意味着你可以进行自我加入,

或者您可以使用%T>%一些登录步骤(使用futile.logger等):

out %>%
 .[etcetera] %>%
 .[etcetera] %T>% 
 .[loggingstep] %>%
 .[etcetera] %>%
 .[., on = SOMEVARS, allow.cartesian = TRUE]
Run Code Online (Sandbox Code Playgroud)

编辑:

这是很晚了,我仍然经常使用它.但我有以下警告.

magrittr增加了开销.

我真的很喜欢在脚本的顶级做这个.它有一个非常清晰和可读的流程,你可以用它做一些巧妙的技巧.

但是我必须在优化之前删除它,如果它是一个被多次调用的函数的一部分.

在这种情况下,你最好用旧式的方式链接data.tables.

  • 有趣.从没想过用dplyr方式链接数据表...... (2认同)

Jaa*_*aap 10

你必须给予之间的返回[]每行的.有关如何将data.table代码划分为多行的示例:

bar <- foo[, .(long_name_here = sum(foo2)), by = var
           ][order(-long_name_here)]
Run Code Online (Sandbox Code Playgroud)

您也可以在每个逗号后返回.一个例子:

bar <- foo[,
           .(long_name_here = sum(foo2)),
           by = var
           ][order(-long_name_here),
             long_name_2 := long_name_here * 10]
Run Code Online (Sandbox Code Playgroud)

有关扩展示例,请参阅此答案


dww*_*dww 10

多年来,RStudio 中的自动缩进与 data.table 管道不对齐的方式一直让我感到沮丧。我最近才意识到有一种巧妙的方法可以解决这个问题,只需将管道操作括在括号中即可。

这是一个简单的例子:

x <- data.table(a = letters, b = LETTERS[1:5], c = rnorm(26))
y <- (
  x
  [, c := round(c, 2)]
  [sample(26)]
  [, d := paste(a,b)]
  [, .(d, foo = mean(c)), by = b]
  )
Run Code Online (Sandbox Code Playgroud)

为什么这有效?因为未闭合的括号向 R 解释器发出信号,表明当前行仍未完成,因此整个管道将被视为连续的代码行。

  • 很好的补充,+1! (2认同)
  • @SimonWoodward - `:=` 运算符是 data.table 功能(最有用的功能之一),专门用于更新 x。无论您是否将操作链接在一起,也无论您是否使用这种格式,它都会这样做。所以,你的问题与这个问答并没有真正的关系,而是更笼统的。为了避免更新 X,您可以 (1) 不使用 `:=` 运算符;或 (2) 以 `copy(x)` 开始管道。 (2认同)