从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会很好。一些功能包括日期检测、尝试用多个空格分隔以处理包含空格的字符值、检测是否有列标题、删除以行开头的字符、支持列表输出等。。。packagedatapasta
对于您要从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]"