通过类似于 rbind 的引用将 data.table 附加到另一个 data.table

R Y*_*oda 3 r data.table

我想在函数内的另一个 data.table 对象的末尾附加(“rbind”)一个 data.table 对象,而不返回组合结果,而是直接附加到第一个数据表对象,这样我就不必分配函数结果再次到第一个data.table。

由于data.table被引用作为函数的参数传递它可能是可能的,但rbindrbindlist你总是创造的,而不是附加到现有data.table对象的新结果对象。

我怎样才能做到这一点?

library(data.table)

dt1 <- data.table(a = 1, b = "hello")
dt2 <- data.table(a = 2, b = "world")

dt.all <- data.table::rbindlist(list(dt1, dt2))

dt.all
#    a     b
# 1: 1 hello
# 2: 2 world


dt.append <- function(x1, x2) {
  x1 <- data.table::rbindlist(list(x1, x2))  # does not change the outer data.table!
  invisible()
}

dt.append(dt1, dt2)

dt1   # I would like to see both rows here
#    a     b
# 1: 1 hello
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们需要将它分配给全局环境中的对象。在 OP 的函数中,它被本地分配给一个名为“x1”的对象,并且函数的好处之一是全局对象不会发生变异(局部范围)

dt.append <- function(x1, x2) {
  obj <- deparse(substitute(x1)) # get the actual object name as a string
  assign(obj, value = data.table::rbindlist(list(x1, x2)), envir = .GlobalEnv)

 }

dt1
#   a     b
#1: 1 hello
#2: 2 world
Run Code Online (Sandbox Code Playgroud)