R是否有类似于Python的"repr"(或Lisp的"prin1-to-string")的功能?

8
我偶尔发现获取R对象的打印表示作为字符字符串会很有用,就像Python的"repr"函数或Lisp的"prin1-to-string"函数一样。在R中是否存在这样的功能?我不需要它在复杂或奇怪的对象上工作,只需要在简单的向量和列表上工作。
编辑:我想要的是生成相同对象所需键入到控制台的字符串,而不是"print(object)"的输出。

7
也许你正在寻找 dput 命令? - Joshua Ulrich
大多数 R 中的对象都有一个默认的打印方法,如果你只是在命令行上调用它们,它们就会按照你要求的方式进行打印。 > x <- 1:10 > x - Justin
@Justin,我的意思是我想要在R控制台中输入的表示形式来构建对象,就像Python中的repr(对于支持的对象)一样。 - Ryan C. Thompson
4个回答

17

我不熟悉你列出的Python/Lisp函数,但我认为你想要使用dputdump

x <- data.frame(1:10)
dput(x)
dump("x", file="clipboard")

1
是的,dump/dput 看起来可以实现我想要的功能。谢谢。 - Ryan C. Thompson
这对于简单的R对象(向量、矩阵、数据框、这些东西的列表、S4类)有效,但对于包含环境的任何内容(闭包、带有环境元素的列表)可能也会失败,甚至其他更复杂的类也是如此。 - Spacedman

6

请参阅评估程序包中的?evaluate

编辑:海报在评论中澄清,他想要重构对象的命令,而不是保存print(object)输出的字符串。 在这种情况下,所需的不是evaluate,而是dput(已在Joshua Ullrich的评论中提到,并且自我发布以来已被转移到答案中)和dump将起作用。 recordPlotreplayPlot将在至少Windows上存储和重新绘制经典图形。 trellis.last.object将检索最后一个lattice图形对象。 还要注意, .Last.value 保留交互式控制台中的最后一个值。


2

我有完全相同的问题。我想知道是否有内置的东西可以做到这一点,或者我需要自己编写。我没有找到任何内置的内容,因此我编写了以下函数:

dputToString <- function (obj) {
  con <- textConnection(NULL,open="w")
  tryCatch({dput(obj,con);
           textConnectionValue(con)},
           finally=close(con))
}

dgetFromString <- function (str) {
  con <- textConnection(str,open="r")
  tryCatch(dget(con), finally=close(con))
}

我认为这是你想要的。下面是一个测试:

> rep <- dputToString(matrix(1:10,2,5))
> rep
[1] "structure(1:10, .Dim = c(2L, 5L))"
> mat <- dgetFromString(rep)
> mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

2
你可以使用capture.output函数:
repr <- function(x) {
  paste(sprintf('%s\n', capture.output(show(x))), collapse='')
}

如果想要不带行号的版本,可以使用以下类似的方法:

repr <- function(x) {
  cat(sprintf('%s\n', capture.output(show(x))), collapse='')
}

只需使用 cat 而不是隐式打印结果。这样就可以消除行号。 - Paul Hiemstra
1
我不想要print(object)的输出,我想要创建该对象所需的字符字符串。 - Ryan C. Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接