3

この質問がすでに回答されている場合は、事前にお詫び申し上げますが、必要なものを見つけることができませんでした. data1.dat、data2.dat という名前のファイルからいくつかの結果をプロットしたい ... ループを使用してデータをインポートすることはできますが、ループを使用して結果をプロットすることができません。最初のデータの結果のみがプロットされます。以下は、私が使用したスクリプトです。

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

問題は「else」の後の部分に関連しています。データはプロットされず、エラー メッセージも表示されません。

助けてくれてありがとう、

4

2 に答える 2

6

の意味のある使用法はほとんどありません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")
于 2013-05-26T16:50:48.357 に答える
2

これは、効果的にのみを使用しているためですdata1

最初のループは次のように展開できます

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

一方、2番目のループは少しバグがあり、障害の原因です。ループを展開すると、次のようになります。

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

data2つまり、 andを取得していると考えている場合、実際には文字列anddata3のみを使用しています(引用符に注意してください)。'data2''data3'

あまりにも多くのデータを想定してコード全体を再構築することなく、これでうまくいくはずです (2 番目のループの場合)。データ ファイルが 3 つしかないため、ループがもたらす問題とは対照的に、ループは少し広範に見えます。

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呼び出しに 2 つのネストされたpaste呼び出しがありますが、この場合は不要です。

paste(paste("data", i, sep=""),"_lambda.dat",sep="") # paste(paste("data", i, "_lambda.dat",sep= "")

于 2013-05-25T13:53:35.447 に答える