数据表中没有 .internal.selfref 的 dput()

jps*_*ith 4 r data.table

最近有人通过以下方式与我分享了他们的数据表dput(),并弹出了一个我以前没有遇到过的错误:

错误:意外的 '<' 位于:" class = c("data.table", "data.frame"), .internal.selfref = <"

经过一番挖掘后,我发现这与 data.tables 特别相关,并且按照这些答案中的建议,删除了internal.selfref = <pointer: 0x7fd60e036ce0>)成功分配数据的技巧。

然而,我预计新手用户会经常共享这些类型的数据;我还没有找到合理/可持续的解决方案来防止使用dput仅临时功能导出和/或在接收运行后将其删除。

如果我showAttributes从control = c("keepNA", "keepInteger", "niceNames", "showAttributes")里面删除,dput那么.internal.selfref结构就消失了,但是关于结构的其他一切也消失了。

上述链接问题中提供的问题和答案年龄为5-9岁;我希望可以使用一些改进的功能(我显然不知道)来告诉我dput忽略这一点,或者也许我可以在数据表本身上做一些事情,然后dput将其.internal.selfref完全删除。

有没有办法提供dput对象的data.table而不产生.internal.selfref?

提前致谢。

问题示例:

dattab <- data.table::data.table(a = 1:5, b = 6:10)
dput(dattab)

structure(list(a = 1:5, b = 6:10), row.names = c(NA, -5L), 
          class = c("data.table", "data.frame"), 
          .internal.selfref = <pointer: 0x7fd60e036ce0>)
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 6

将 data.table 转换为 data.frame,然后将dput其转换。

dput(as.data.frame(dattab))
## structure(list(a = 1:5, b = 6:10), row.names = c(NA, -5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)


r2e*_*ans 5

有时我认为与适当的类共享它很有用,所以我使用这个函数:

#' dput into a single line
#'
#' @param x object
#' @param assign logical, whether to get the 'x' object's name and
#'   prepend it to the string
#' @param DT logical, whether to remove (and wrap with 'setDT')
#'   'internal.selfref' in the dput output
#' @return character length 1, invisibly
#' @export
r2dput <- function(x, assign = TRUE, DT = TRUE) {
  out <- deparse1(x)
  if (isTRUE(DT)) {
    out2 <- gsub(",\\s*\\.internal\\.selfref\\s*=\\s*<pointer:\\s*[0-9a-fx]+>", "", out)
    if (out != out2) {
      out <- paste0("data.table::as.data.table(", out2, ")")
    }
  }
  if (assign) {
    out <- paste(c(as.character(substitute(x)), "<-", out), collapse = " ")
  }
  if (R.version$os == "mingw32") {
    writeLines(out, con = "clipboard")
  } else {
    clipr::write_clip(out)
  }
  invisible(out)
}
Run Code Online (Sandbox Code Playgroud)

举个例子,

MT <- as.data.table(mtcars[1:3, 11:4])
MT
#     carb  gear    am    vs  qsec    wt  drat    hp
#    <num> <num> <num> <num> <num> <num> <num> <num>
# 1:     4     4     1     0 16.46 2.620  3.90   110
# 2:     4     4     1     0 17.02 2.875  3.90   110
# 3:     1     4     1     1 18.61 2.320  3.85    93
Run Code Online (Sandbox Code Playgroud)

当我想在 SO(或与同事)的问题中分享该数据时,我输入r2dput(MT)(因为,你知道,我是 r2evans ;-),我只需将 ( ) 粘贴Ctrl-V到评论/问题/答案中并得到这个:

MT <- data.table::as.data.table(structure(list(carb = c(4, 4, 1), gear = c(4, 4, 4), am = c(1, 1, 1), vs = c(0, 0, 1), qsec = c(16.46, 17.02, 18.61), wt = c(2.62, 2.875, 2.32), drat = c(3.9, 3.9, 3.85), hp = c(110, 110, 93)), row.names = c(NA, -3L), class = c("data.table", "data.frame")))
Run Code Online (Sandbox Code Playgroud)

这会删除pointer不起作用的内容,它会明确as.data.table(.)我真正正在使用的类,并将其全部保留在一行上(因为我不喜欢dput格式化代码块中的默认换行方法)。

(编辑为clipr在非 Windows 上使用。我不确定它在 Macos 上是否同样有效。)