7

Suppose I have a file "data.txt", which can be created with the following code

m <- matrix(c(13, 14, 4950, 20, 50, 4949, 22, 98, 4948, 
              30, 58, 4947, 43, 48, 4946), 5, byrow = TRUE)
write.table(m, "data.txt", row.names = FALSE, col.names = FALSE)

Reading the file into R with scan, a message is delivered along with the data.

( s <- scan("data.txt") )
# Read 15 items
#  [1]   13   14 4950   20   50 4949   22   98 4948
# [10]   30   58 4947   43   48 4946

I'd like to retrieve the message Read 15 items as a character vector. I know I can get the last recorded warning by typing last.warning, and can turn it into a character vector with names(last.warning), but there is no such object as last.message.

Is there a way to convert an outputted message to a character vector? The desired result would be

[1] "Read 15 items" 
Rich Scriven
  • 97,041
  • 11
  • 181
  • 245

2 Answers2

9

The default hander for message() sends the result to stderr via cat(). You can capture that with

tc <- textConnection("messages","w")
sink(tc, type="message")
s <- scan("data.txt")
sink(NULL, type="message")
close(tc)

messages
# [1] "Read 5 items"
MrFlick
  • 195,160
  • 17
  • 277
  • 295
2

There's a convenient wrapper for sink in utils::capture.output()

z<-capture.output(s<-scan("data.txt"), type="message")
z
#> [1] "Read 15 items"
dmi3kno
  • 2,943
  • 17
  • 31