【问题标题】:Append a data.table to another data.table by reference similar to rbind通过类似于 rbind 的引用将 data.table 附加到另一个 data.table
【发布时间】:2018-12-02 04:13:56
【问题描述】:

我想在末尾附加(“rbind”)一个 data.table 对象 函数中的另一个 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

【问题讨论】:

  • 您正在分配给“x1”,即在本地范围内。 &lt;- 的 lhs 上的对象按字面意思理解为“x1”。可能你需要assign
  • 您得到的不是通过引用/就地编辑表进行修改——而是一个新表绑定到与原始表相同的符号/名称。
  • @Frank 是的,你是绝对正确的,我只是重复使用符号名称来解决我的问题。我不知道任何可以直接附加到现有 data.tabledata.table 函数 - 欢迎任何提示。我认为这值得提出更改请求。
  • 是的,这将是一个很酷的功能。我不太了解内部结构,无法知道为什么没有(据我所知)要求。 Fwiw,通过引用删除行在这里:github.com/Rdatatable/data.table/issues/635

标签: r data.table


【解决方案1】:

我们需要将它分配给全局环境中的对象。在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多