2013-05-25 33 views
3

如果這個問題已經得到解答,我很抱歉,但我一直未能找到我所需要的。 我想繪製名爲data1.dat,data2.dat的文件的一些結果...我設法用循環導入數據,但我無法使用循環繪製結果。只繪製第一個數據的結果。下面是我使用的腳本:Rscript情節循環數據

for(i in 1:3){ 
    assign(paste("data", i, sep=""), 
    read.table(file=paste(paste("data", i, sep=""),"_lambda.dat",sep=""),head=TRUE, sep=" ")) 
} 

#plot 
for(i in 1:3){ 
    if(i==1){ 
    plot(data.frame(data1[1], data1[2]), xlim=c(-0.2, -7), ylim=c(0.31, 0.35), yaxt="n", type="l", xlab="", ylab="",lty="solid", col="red2", lwd=4, axes=TRUE) 
    } else { 
    lines(data.frame(paste("data", i, "[1]", sep=""), paste("data", i, "[2]", sep="")) ,lty="twodash", col="deepskyblue4", lwd=4) 
    } 
} 

的問題是關係到之後的「其他人」的部分。數據沒有繪製,我也沒有收到任何錯誤消息。

感謝您的幫助,

+0

嗨,歡迎來到stackoverflow!你能分享一些你正在饋入腳本的數據文件的子樣本嗎?這將提供一個明確的答案更容易。看看[如何創建一個好的可重現的R例子](http://stackoverflow.com/a/5963610/2352071)。 – thunk

回答

5

有未落爲assign一個有意義的使用你在上面做什麼能更容易地使用列表來完成:

# Read the data by inserting each data.frame into our list. 
data <- list() 
for (i in 1:3) { 
    data[[i]] <- data.frame(runif(10), rnorm(10)) # Replace with your call to read.table. 
} 

# As we are lazy, we can pre-save our styles and just use them later 
ltys <- c('solid', 'twodash', 'twodash') 
cols <- c('red', 'deepskyblue4', 'deepskyblue4') 

# Creating the empty plot first allows us to do everything else with lines. Note that there are a ton of different ways to archive this. 
plot(NA, xlim=c(0,1), ylim=c(-2,2)) 
# And now we just may access the data by using the lists. 
for (i in 1:length(data)) { 
    d <- data[[i]] 
    lines(d[,1], d[,2], lty=ltys[i], col=cols[i], lwd=4) 
} 

如果我們的目標優雅,我們甚至可以使用完全不同的方法:

# This time we will read all data into one data.frame. 
# This requires the data to be of the same form, however. 
data <- data.frame() 
for (i in 1:3) { 
    d <- data.frame(x=runif(10), y=rnorm(10)) 
    # Here is the trick: We add the index i (or a file name, or something totally different) as a separate column. 
    data <- rbind(data, cbind(d, group=i)) 
} 
# This is just to ensure that our group column is a factor. 
data$group <- as.factor(data$group) 

# Now, plotting could be done by various ways. Personally, I like the elegance of ggplot2. 
library(ggplot2) 
qplot(x,y,data=data, col=group, geom="line") 
2

這是因爲你只能有效利用data1

第一個循環,而可你的第二個循環是有點馬車和故障的原因擴大到

data1 = read.table('data1_lambda.dat', ...) 
data2 = read.table('data2_lambda.dat', ...) 
data3 = read.table('data3_lambda.dat', ...) 

。 如果我擴大循環,什麼情況是:

plot(data.frame(data1[1], data1[2]), ...) 
lines(data.frame('data2[1]', 'data2[2]', ...) 
lines(data.frame('data3[1]', 'data3[2]', ...) 

即你在想什麼,你真的只能使用字符串'data2''data3'(注意引號)被取data2data3。如果不假設太多的數據並重構整個代碼,這應該可以做到這一點(第二個循環)。既然你只有三個數據文件,循環似乎有點廣泛與他們引入的問題。

plot(data.frame(data1[1], data1[2]), xlim=c(-0.2, -7), ylim=c(0.31, 0.35), yaxt="n", type="l", xlab="", ylab="",lty="solid", col="red2", lwd=4, axes=TRUE) 
lines(data.frame(data2[1], data2[2]) ,lty="twodash", col="deepskyblue4", lwd=4) 
lines(data.frame(data3[1], data3[2]) ,lty="twodash", col="deepskyblue4", lwd=4) 

如果你堅持循環,我們可以這樣做:

for(i in 1:3){ 
    if(i==1){ 
    plot(data.frame(data1[1], data1[2]), xlim=c(-0.2, -7), ylim=c(0.31, 0.35), yaxt="n", type="l", xlab="", ylab="",lty="solid", col="red2", lwd=4, axes=TRUE) 
    } else { 
    dat <- get(paste('data', i, sep='')) 
    lines(data.frame(dat[1], dat[2]) ,lty="twodash", col="deepskyblue4", lwd=4) 
    } 
} 

作進一步評論你的代碼,在您的通話read.table,你有兩個嵌套調用paste,在這種情況下是不必要的。

糊(膏( 「數據」,I,九月= 「」), 「_ lambda.dat」,月= 「」) #可以與 糊(膏( 「數據」,I,「_lambda完成.DAT」,九月=‘’)