数据表中不带.internal.selfref的dput()

55ooxyrt  于 2023-05-04  发布在  其他
关注(0)|答案(3)|浏览(129)

最近有人通过dput()与我共享了他们的数据表,并弹出了一个我以前从未遇到过的错误:
错误:意外的“〈”在:“class = c(“data.table”,“data.frame”),.internal.selfref =〈”
经过一番挖掘,我发现这是related specifically to data.tables,正如these answers中所建议的那样,删除internal.selfref = <pointer: 0x7fd60e036ce0>)成功地分配了数据。
然而,我预期在新手用户之间频繁地共享这些类型的数据;我还没有找到一个合理的/可持续的解决方案来防止这与dput导出,只有ad-hoc函数和/或删除后,收到运行它。
如果我从dput中的control = c("keepNA", "keepInteger", "niceNames", "showAttributes")中删除showAttributes,那么.internal.selfref就消失了,但结构的其他所有内容也都消失了。
上述链接问题中提供的问题和答案为5-9岁;我希望可以提供一些改进的功能(我显然不知道),可以告诉dput忽略这一点,或者如果我可以对dput之前的数据表本身做一些事情,可以完全删除.internal.selfref

有没有办法提供data.table对象的dput,而不产生.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>)
i7uaboj4

i7uaboj41#

将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")
nxowjjhe

nxowjjhe2#

有时候我觉得把它分享给合适的类会很有用,所以我使用这个函数:

#' 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 'as.data.table')
#'   '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 = " ")
  }
  writeLines(out, con = "clipboard")
  invisible(out)
}

作为一个例子,

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

当我想在SO上(或与同事)分享问题中的数据时,我输入r2dput(MT)(因为,你知道,我是r2 evans;- ),我只是将(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")))

这删除了不起作用的pointer,它 Package 在as.data.table(.)中,清楚地表明我真正使用的是什么类,并将其全部保留在一行中(因为我不喜欢格式化代码块中默认的dput换行符方法)。
(The writeLines(., con="clipboard")的使用是以windows为中心的;linux/macos需要其他机制,我只是没有调整我的代码,使其与平台无关。)

7xzttuei

7xzttuei3#

考虑一下{constructive}包,它几乎总是比dput()更好,尤其是对于Stack Overflow。它很快就会在CRAN上发布,但现在你需要安装GitHub版本。

# remotes::install_github("cynkra/constructive")
library(constructive)
dattab <- data.table::data.table(a = 1:5, b = 6:10)
MT <- data.table::as.data.table(mtcars[1:3, 11:4])

construct(dattab)
#> data.table::data.table(a = 1:5, b = 6:10)

construct(MT)
#> data.table::data.table(
#>   carb = c(4, 4, 1),
#>   gear = rep(4, 3L),
#>   am = rep(1, 3L),
#>   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)
#> )

创建于2023-04-29带有reprex v2.0.2

相关问题