2009-09-10 2 views
17

Wie wäre es im folgenden Beispiel möglich, den Schritt des Schreibens in die Datei "test.txt" zu überspringen, d. H. Das cat-Ergebnis einem Objekt zuzuordnen und trotzdem das gleiche Endergebnis zu erzielen?Wie wird die Ausgabe von cat einem Objekt zugewiesen?

Ich dachte, ich würde das vollständige Beispiel einschließen, um Hintergrund zu meinem 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 

Antwort

13

Statt cat in eine Datei ing, warum nicht die paste Befehl verwenden, anstatt eine Zeichenfolge 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" 

nun stattdessen eine cat dann tun readlines Sie können diese Zeichenfolge direkt in strsplit passieren einfach.

2

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) 
27

Als eine allgemeinere Lösung können Sie die Capture-Ausgabefunktion verwenden. Es ergibt sich ein Zeichenvektor mit Elementen, die jeder Zeile der Ausgabe 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] ""  
1

Es gibt auch die assign-Anweisung, die Sie einen Namen erstellen kann und ein Objekt, um es einzustellen. Sehr nützlich, wenn Sie eine Reihe von Tests iterieren und sie mit dynamischen Werten benennen möchten.

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

wird die Paste Anweisung Mary zuweisen. Allerdings sagen Sie, Sie haben eine Reihe von Regressionen ausgeführt und wollten Ihre Regressionsobjekte nach Prädiktor benannt haben. Man könnte so etwas wie

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

tun, die Sie das Objekt

myRegressionPredictorName wie Sie lineares Modell geben würde.

1

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.

Verwandte Themen