Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to assign output of cat to an object?

How would it be possible in the example below to skip the step of writing to file "test.txt", i.e. assign the cat-result to an object, and still achieve the same end result?

I thought I'd include the full example to give background to my problem.

test <- c("V 1", "x", "1 2 3", "y", "3 5 8", "V 2", "x", "y", "V 3", "y", "7 2 1", "V 4", "x", "9 3 7", "y")  # Write selection to file cat(test, "\n", file="test.txt") test2 <- readLines("test.txt") test3 <- strsplit(test2, "V ")[[1]][-1]  # Find results x <- gsub("([0-9]) (?:x )?([0-9] [0-9] [0-9])?.*", "\\1 \\2 ", test3, perl = TRUE) y <- gsub("([0-9]).* y ?([0-9] [0-9] [0-9])?.*", "\\1 \\2 ", test3, perl = TRUE)  # Eliminate tests with no results x1 <- x[regexpr("[0-9] ([^0-9]).*", x) == -1] y1 <- y[regexpr("[0-9] ([^0-9]).*", y) == -1]  # Dataframe of results xdf1 <- read.table(textConnection(x1), col.names=c("id","x1","x2","x3")) ydf1 <- read.table(textConnection(y1), col.names=c("id","y1","y2","y3")) closeAllConnections()  # Dataframe of tests with no results x2 <- x[regexpr("[0-9] ([^0-9]).*", x) == 1] y2 <- y[regexpr("[0-9] ([^0-9]).*", y) == 1]  df1 <- as.integer(x2[x2 == y2]) df1 <- data.frame(id = df1)  # Merge dataframes results <- merge(xdf1, ydf1, all = TRUE) results <- merge(results, df1, all = TRUE) results 

Results in:

  id x1 x2 x3 y1 y2 y3 1  1  1  2  3  3  5  8 2  2 NA NA NA NA NA NA 3  3 NA NA NA  7  2  1 4  4  9  3  7 NA NA NA 
like image 323
learnr Avatar asked Sep 10 '09 14:09

learnr


2 Answers

As a more general solution, you can use the capture output function. It results in a character vector with elements corresponding to each line of the output.

your example:

test2<-capture.output(cat(test)) 

here is a multi-line example:

> out<-capture.output(summary(lm(hwy~cyl*drv,data=mpg))) > out  [1] ""                                                                 [2] "Call:"                                                            [3] "lm(formula = hwy ~ cyl * drv, data = mpg)"                        [4] ""                                                                 [5] "Residuals:"                                                       [6] "    Min      1Q  Median      3Q     Max "                         [7] "-8.3315 -1.4139 -0.1382  1.6479 13.5861 "                         [8] ""                                                                 [9] "Coefficients:"                                                   [10] "            Estimate Std. Error t value Pr(>|t|)    "            [11] "(Intercept)  32.1776     1.2410  25.930  < 2e-16 ***"            [12] "cyl          -2.0049     0.1859 -10.788  < 2e-16 ***"            [13] "drvf          8.4009     1.8965   4.430 1.47e-05 ***"            [14] "drvr          8.2509     6.4243   1.284    0.200    "            [15] "cyl:drvf     -0.5362     0.3422  -1.567    0.119    "            [16] "cyl:drvr     -0.5248     0.8379  -0.626    0.532    "            [17] "---"                                                             [18] "Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 " [19] ""                                                                [20] "Residual standard error: 2.995 on 228 degrees of freedom"        [21] "Multiple R-squared: 0.7524,\tAdjusted R-squared: 0.747 "          [22] "F-statistic: 138.6 on 5 and 228 DF,  p-value: < 2.2e-16 "        [23] ""     
like image 185
Ian Fellows Avatar answered Sep 21 '22 14:09

Ian Fellows


Instead of cating to a file, why not use the paste command to generate a string instead?

> paste(test, collapse="\n") [1] "V 1\nx\n1 2 3\ny\n3 5 8\nV 2\nx\ny\nV 3\ny\n7 2 1\nV 4\nx\n9 3 7\ny" 

Now instead of doing a cat then readlines you can just pass this string directly into strsplit.

like image 37
Jonathan Chang Avatar answered Sep 20 '22 14:09

Jonathan Chang