Frage

Wie wäre es im Beispiel unten möglich sein, den Schritt des Schreibens überspringen „test.txt“, das heißt weisen Sie das Katze-Ergebnis zu einem Objekt-Datei, und immer noch das gleiche Endergebnis erreichen?

Ich dachte, ich würde die volle Beispiel sind Hintergrund für mein Problem zu geben.

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

Ergebnisse 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
War es hilfreich?

Lösung

Statt in eine Datei von cating, verwendet warum nicht den paste Befehl einen String statt zu generieren?

> 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"

Jetzt stattdessen eine cat dann tun readlines Sie nur diese Zeichenfolge direkt in strsplit passieren kann.

Andere Tipps

Als eine allgemeine Lösung, können Sie die Capture-Output-Funktion verwenden. Es führt zu einem Zeichenvektor mit Elementen, die jede Zeile des Ausgangs entsprechen.

Ihr Beispiel:

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

Hier ist ein mehrzeiliges Beispiel:

> 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] ""    

Versuchen

> f <- textConnection("test3", "w")
> cat(test, "\n", file=f)
> test3
[1] "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 "
> close(f)

Es gibt auch die assign Aussage, die Sie erlaubt, einen Namen zu bauen und ein Objekt, um es einzustellen. Sehr nützlich, wenn Sie eine Reihe von Tests durchlaufen wollen und benennen Sie diese mit dynamischen Werten.

assign ( "Mary", paste (Test, sep = "\ n"))

wird die Paste Anweisung mary zuweisen. Allerdings sagen Sie eine Reihe von Regressionen wurden ausgeführt und Ihre Regressions Objekte wollte durch Prädiktor genannt. Sie könnten wie etwas tun

assign(paste("myRegression",names(dataframe)[2],sep=""), lm(dataframe$response~dataframe[,2]))

was würden Sie das Objekt

myRegressionPredictorName wie Sie lineares Modell.

Versuchen Sie, die folgenden Codes:

writeLines(capture.out((summary(lm(hwy~cyl*drv,data=mpg)),con="summary.txt",sep="\n")

Dann können Sie die TXT-Datei „summary.txt“ öffnen Sie Ihre Ergebnisse zu sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top