遗憾的是,您经常会看到有关 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/