2009-09-10 20 views
17

以下の例では、ファイル "test.txt"に書き込む、つまりcat-resultをオブジェクトに割り当て、同じ最終結果を達成するステップをスキップできますか?catの出力をオブジェクトに割り当てる方法は?

問題の背景を説明するための完全な例を含めると思いました。中

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 

結果:

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 

答えて

13

代わりのcatがファイルにINGのお試しください!

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

代わりに、その後catをやってあなただけstrsplitに直接この文字列を渡すことができreadlines

2

代わりに文字列を生成するpasteコマンドを使用しない理由は、

> 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

より一般的な解決方法として、キャプチャ出力機能を使用できます。これは、出力の各行に対応する要素を持つ文字ベクトルになります。

あなたの例:ここ

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

は、複数行の例です:

> 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

あなたが名前を構築し、それにオブジェクトを設定することができます代入文でもあります。大量のテストを繰り返し、動的な値で名前を付けたい場合に非常に便利です。

割り当て( "メリー"、ペースト(試験、SEPが= "の\ n"))

メアリーにペースト文を割り当てます。しかし、あなたが回帰の束を実行していたと言うと、プレディクタによって指定された回帰オブジェクトが必要でした。あなたは、線形モデルとして、あなたにオブジェクト

myRegressionPredictorNameを与えるだろう

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

ような何かを行うことができます。

1

は、以下のコードを試してみてください。

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

次に、あなたがあなたの結果を確認するためにtxtファイル "がSummary.txt" を開くことができます。

関連する問題