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

从print()控制台输出重新创建向量,r,R,遗憾的是,您经常会在上看到问题,以便以一种格式显示数据 这是不可复制的;通常只是print()的复制结果 set.seed(1) x <- sample(LETTERS, 40, replace = T) y <- rnorm(20) 。。。或者这个: y [1] 0.91897737 0.78213630 0.07456498 -1.98935170 0.61982575 [6] -0.05612874 -0.15579551 -1.47075238 -0.4781

遗憾的是,您经常会在上看到问题,以便以一种格式显示数据 这是不可复制的;通常只是
print()
的复制结果

set.seed(1)

x <- sample(LETTERS, 40, replace = T)
y <- rnorm(20)
。。。或者这个:

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)

y\u printed我用
scan
来解决这个问题

你能用下面的代码做一个函数吗

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'

y <- scan(what = character(), text = y)
y <- sub("^\\s*\\[\\d+\\]", "", y)
y <- as.numeric(y[y != ""])

注意参数
quiet
。我将默认值设置为
FALSE
,就像在
scan
的定义中一样,因为我更喜欢查看是否实际读取了任何内容。

我们可以模拟读取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
库(tidyverse)
取消打印%str\u replace\u all(“*\[\\d+\\]*”,”)%%>%str\u replace\u all(“+”,“\n”)%%>%
text连接%>%read.table
}
取消打印('[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'>%人头
#V1
#1  0.91897737
#2  0.78213630
#3  0.07456498
#4 -1.98935170
#5  0.61982575
#6 -0.05612874
取消打印('[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”)%%>%
#V1
#1克
#2 J
#3 O
#4 X
#5楼
#6倍
处理字符串中括号的更详细版本: 还提供了正确的输出:矢量,而不是数据帧

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]"
取消打印%readLines%>%
str\u replace(“*\\[\\d+\\]*”,“)%>%
粘贴(折叠=“”)%>%str\u替换所有(“,“\n”)%>%
textConnection%>%read.table(stringsAsFactors=FALSE)
t$V1%>%str\u替换所有(“\n”,”)
}
x
为了便于使用,我最终对@RuiBarradas的答案进行了一点修改,以包括
我想要的一些功能:从剪贴板读取,以及键入猜测(使用
读者的帮助


rescue\u vector我可以想象,一个简单的实现不会太困难,所以虽然这样的实现当然是受欢迎的,但我更想知道这个功能是否已经在一个发布的软件包中提供了。拥有这样一个功能并将其链接到插件、热键或snipper会很好。一些功能包括日期检测、尝试用多个空格分隔以处理包含空格的字符值、检测是否有列标题、删除以行开头的字符、支持列表输出等。。。package
datapasta
对于您要从web复制粘贴的表有类似的功能,但上次我检查时,它在如此多的表上运行得不太好。@Moody_Mudscapper是的,这会很有用。考虑到软件包,看起来这样的东西非常适合增强datapasta。我觉得数值参数有点毫无意义,因为有比字符串或数值更多的选项。不过,这是一个很好的解决方案!我喜欢:
scan()
是我的新朋友!不过,一些启发式方法对于猜测类型肯定是有用的。我相信
data.table::fread
可以猜测类型,也许可以调整解决方案来利用它。模式可以更新为
“^\\s*\[\\d+\\]”
,以支持OP的示例(以空格开头)。我认为在正则表达式中使用
\\s
更明确一些类型猜测肯定有用;字符串替换让我有点担心,例如(一个稍微做作的示例)
unprint(“[1]”x+y[1]”)
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"'

recreateVector(x, numeric = FALSE)
#Read 43 items
# [1] "G" "J" "O" "X" "F" "X" "Y" "R" "Q" "B" "F" "E" "R" "J" "U"
#[16] "M" "S" "Z" "J" "U" "Y" "F" "Q" "D" "G" "K" "A" "J" "W" "I"
#[31] "M" "P" "M" "E" "V" "R" "U" "C" "S" "K"
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]"