最近有人通过以下方式与我分享了他们的数据表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)
将 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)
有时我认为与适当的类共享它很有用,所以我使用这个函数:
#' 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 上是否同样有效。)
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |