2009-09-10 21 views
17

¿Cómo sería posible en el siguiente ejemplo omitir el paso de escribir en el archivo "test.txt", es decir, asignar el resultado de gato a un objeto, y aun así lograr el mismo resultado final?¿Cómo asignar la salida de cat a un objeto?

Pensé que incluiría el ejemplo completo para dar un segundo plano a mi problema.

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 

Resultados en:

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 

Respuesta

13

En lugar de cat ing a un archivo, por qué no usar el comando paste para generar una cadena en lugar?

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

Ahora, en lugar de hacer una cat continuación readlines puede simplemente pasar esta serie directamente en strsplit.

2

Prueba

> 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

Como solución más general, puede utilizar la función de salida de captura. Resulta en un vector de caracteres con elementos correspondientes a cada línea de la salida.

tu ejemplo:

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

aquí es un ejemplo de varias líneas:

> 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

Hay también la sentencia de asignación, que le permite construir un nombre y configurar un objeto a la misma. Muy útil si desea iterar un montón de pruebas y nombrarlas con valores dinámicos.

Asignar ("María", la pasta (prueba, sep = "\ n"))

asignará la declaración de pasta a María. Sin embargo, supongamos que está ejecutando un montón de regresiones y desea que sus objetos de regresión se denominen por predictor. Se podría hacer algo como

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

que le daría el objeto

myRegressionPredictorName como modelo lineal.

1

Pruebe los siguientes códigos:

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

A continuación, se puede abrir el archivo txt "summary.txt" para ver los resultados.

Cuestiones relacionadas