Comment assigner la sortie de chat à un objet?
-
05-07-2019 - |
Question
Comment serait-il possible, dans l'exemple ci-dessous, de sauter l'étape d'écriture dans le fichier "test.txt", c'est-à-dire d'affecter le résultat cat à un objet et d'obtenir le même résultat final?
Je pensais inclure l'exemple complet pour expliquer l'arrière-plan de mon problème.
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
Résultats 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
La solution
Au lieu de cat
dans un fichier, pourquoi ne pas utiliser la commande coller
pour générer une chaîne?
> 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"
Maintenant, au lieu de faire un cat
puis readlines
, vous pouvez simplement passer cette chaîne directement dans strsplit
.
Autres conseils
Comme solution plus générale, vous pouvez utiliser la fonction de sortie de capture. Il en résulte un vecteur de caractère avec des éléments correspondant à chaque ligne de la sortie.
votre exemple:
test2<-capture.output(cat(test))
voici un exemple multiligne:
> 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] ""
Essayez
> 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)
Il existe également l'instruction assign qui vous permet de créer un nom et de lui définir un objet. Très utile si vous souhaitez parcourir plusieurs tests et les nommer avec des valeurs dynamiques.
assigner ("mary", coller (test, sep = "\ n"))
assignera l'instruction paste à mary. Cependant, supposons que vous exécutiez un ensemble de régressions et que vous vouliez que vos objets de régression soient nommés par un prédicteur. Vous pourriez faire quelque chose comme
assign(paste("myRegression",names(dataframe)[2],sep=""), lm(dataframe$response~dataframe[,2]))
qui vous donnerait l'objet
myRegressionPredictorName en tant que modèle linéaire.
Essayez les codes suivants:
writeLines (capture.out ((summary (lm (hwy ~ cyl * drv, data = mpg)), con = "quot summary.txt", sep = "\ n")
Ensuite, vous pouvez ouvrir le fichier txt " summary.txt " pour voir vos résultats.