从 print() 控制台输出重新创建向量

标签 r

遗憾的是,您经常会看到有关 SO 以某种格式呈现数据的问题
那是不可复制的;通常只是 print() 的复制结果...

set.seed(1)

x <- sample(LETTERS, 40, replace = T)
y <- rnorm(20)

......比如这样:
x
 [1] "G" "J" "O" "X" "F" "X" "Y" "R" "Q" "B" "F" "E" "R" "J" "U" "M" "S"
[18] "Z" "J" "U" "Y" "F" "Q" "D" "G" "K" "A" "J" "W" "I" "M" "P" "M" "E"
[35] "V" "R" "U" "C" "S" "K"

... 或这个:
y
 [1]  0.91897737  0.78213630  0.07456498 -1.98935170  0.61982575
 [6] -0.05612874 -0.15579551 -1.47075238 -0.47815006  0.41794156
[11]  1.35867955 -0.10278773  0.38767161 -0.05380504 -1.37705956
[16] -0.41499456 -0.39428995 -0.05931340  1.10002537  0.76317575

理想情况下,我希望能够将文本从上面的块复制到我的剪贴板,并调用一些函数 foo(),这样 all.equal(foo(), x) 用于离散数据类型,all(near(foo(), y)) 用于浮点数(考虑到打印的准确性)。

有没有一种简单的方法来(大约)从 print() 的复制结果重建一个简单的向量?

编辑: 具有讽刺意味的是,我意识到我自己的例子并不能完全重现。这是创建复制的打印输出的代码:
y_printed <- capture.output(y)

最佳答案

我们可以模仿读取 CSV 文件时对数据类型的猜测:

library(tidyverse)
unprint <- function(s) {
  s %>% str_replace_all(" *\\[\\d+\\] *","") %>% str_replace_all(" +","\n") %>% 
  textConnection %>% read.table
}
unprint(' [1]  0.91897737  0.78213630  0.07456498 -1.98935170  0.61982575
 [6] -0.05612874 -0.15579551 -1.47075238 -0.47815006  0.41794156
[11]  1.35867955 -0.10278773  0.38767161 -0.05380504 -1.37705956
[16] -0.41499456 -0.39428995 -0.05931340  1.10002537  0.76317575') %>% head

#           V1
#1  0.91897737
#2  0.78213630
#3  0.07456498
#4 -1.98935170
#5  0.61982575
#6 -0.05612874


unprint(' [1] "G" "J" "O" "X" "F" "X" "Y" "R" "Q" "B" "F" "E" "R" "J" "U" "M" "S"
[18] "Z" "J" "U" "Y" "F" "Q" "D" "G" "K" "A" "J" "W" "I" "M" "P" "M" "E"
[35] "V" "R" "U" "C" "S" "K"') %>% head

#  V1
#1  G
#2  J
#3  O
#4  X
#5  F
#6  X

处理字符串中括号的更详细版本:
还给出了正确的输出:一个向量,而不是一个数据框。
unprint <- function(s) {
  t <- s %>% textConnection %>% readLines %>% 
    str_replace(" *\\[\\d+\\] *","") %>%
    paste(collapse=' ') %>% str_replace_all(" ","\n") %>% 
    textConnection %>% read.table(stringsAsFactors=FALSE) 
  t$V1 %>% str_replace_all("\n"," ")
}

x <- unprint(' [1] "x + y  [1]" "x + z  [2]"')
x
#[1] "x + y  [1]" "x + z  [2]"

关于从 print() 控制台输出重新创建向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493980/

相关文章:

r - 如何在 vegan 的 biplot() 函数中更改物种标签的字体大小

javascript - 我可以使用 Shiny R 来扩展一个完整的网络应用程序吗?

r - 元编程和 R 中的替代函数

r - 如何以更快的方式处理和组合列表中的 data.frames

r - 如何使用 kableextra 更改特定文本值的颜色

r - 如何像 Microsoft Excel 表格一样格式化 R Shiny DataTable

r - R 中某些点的条件着色散点图

R : How to use self-defined function with outer

r - 在 R 中拆分 "the middle"中的列

r - 避免在拟合多个线性回归模型时重复编写模型公式