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)
这确实是可能的,但你想为此使用额外的大括号:
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,因此%>%将数据作为第一个参数传递是有意义的,因为没有数据。