可以在管道中使用 data.table 的 rbindlist

Pre*_*ost 2 r magrittr data.table

data.table rbindlist是否可以在管道操作中使用?我在下面发布了 MWE。data.table我尝试通过管道创建一个crbindlist但出现错误。

相反,我必须操作 c,然后将 分配给c (但 c在 中的参数rbindlist中使用。如果可能的话,我想避免这种情况,我试图通过listrbindlistrbindlist上面的管道中的 in 来实现这一点。这可能吗?

如有任何帮助,我们将不胜感激,谢谢。

library(data.table)
library(magrittr)

a <- data.table(colA = 1:10,
                colB = 11:20)

b <- data.table(colA = 300,
                colB = 500)

c <- a %>% 
  .[, colB := colB * 10] %>% 
  rbindlist(list(.,b),
            use.names = TRUE,
            fill = TRUE)
#> Error in rbindlist(., list(., b), use.names = TRUE, fill = TRUE): idcol must be a logical or character vector of length 1. If logical TRUE the id column will named '.id'.

c <- a %>% 
  .[, colB := colB * 10]

c <- rbindlist(list(c,b),
               use.names = TRUE,
               fill = TRUE)
Run Code Online (Sandbox Code Playgroud)

Jul*_*ora 5

这确实是可能的,但你想为此使用额外的大括号:

c <- a %>% 
  .[, colB := colB * 10] %>% 
  {rbindlist(list(.,b), use.names = TRUE, fill = TRUE)}
Run Code Online (Sandbox Code Playgroud)

从错误本身来看,原因很明显:

# Error in rbindlist(., list(., b), use.names = TRUE, fill = TRUE): ...
Run Code Online (Sandbox Code Playgroud)

也就是说,你的尝试相当于

rbindlist(aTransformed, list(aTransformed, b), use.names = TRUE, fill = TRUE)
Run Code Online (Sandbox Code Playgroud)

这显然不是您的意图,并且不起作用,因为rbindlist想要接收要绑定的对象列表作为第一个参数。现在,如果我们想使用快捷方式,.但不想将数据传递给第一个参数,我们可以使用额外的括号{}来创建表达式。表达式的类型为{x <- 2; y <- x^2; y + x}returning y + x,因此%>%将数据作为第一个参数传递是有意义的,因为没有数据。