使用循环记录一系列情节
Record a series of plot using a loop
我有一个名为 primes
的向量,长度为 100,包含前一百个素数,如下所示:
primes
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109
[30] 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
[59] 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449
[88] 457 461 463 467 479 487 491 499 503 509 521 523 541
我还有一个名为 optm
的数据框,其中所有这些素数作为变量,学习率递减作为行。例如,这是我通过绘制第 37 个素数得到的:
plot.default(optm$step, optm$seed37, type = "l", ylab = "learning rate",
xlab = "first third iterations", main = 'seed37')
我想将这一百个情节提取并保存在一个 4*5 的多帧上。结果我想要 5 个文件(= 100 个图),这就是为什么我在以下循环中实现 a
作为记录限制:
a <- 20
par(mfrow = c(4, 5))
for(i in primes) {
cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
for(j in 1:length(primes)) {
if (j==a){
dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
a = a + 20
dev.off()
}
}
}
问题是我电脑上录制的文件很相似,并且具有完全相同的情节(第一个seed2)。我的错误在哪里?
编辑:
a = 0
par(mfrow = c(4, 5))
for(i in primes) { for(j in length(primes)) {cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
a = (a +1)
if(a==20) {
dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
dev.off()
}
}
}
这个模式适用于前 20 个。所以我编写了一个这样的序列:
foo = seq(0, length(primes), by=20)
现在,我需要在 if
命令中调用 foo
的任何值而不是 20。我该如何管理?
你只需要 1 个 for 循环:
a <- 20
par(mfrow = c(4, 5))
for(i in seq(length(primes))) {
cln <- paste0("seed",primes[i])
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
if (i&&a == 0){
dev.copy(png, paste0(i,'optm.png'),width=8,height=6,units="in",res=100)
dev.off()
}
}
很抱歉回答我自己的问题,但我确实找到了方法。肯定不是最好的,但以下代码有效。
a = 0
b = 20
par(mfrow = c(4, 5))
for(i in primes) {cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
a = (a +1)
print(a)
if (a == b) {
dev.copy(png, paste0(a,'optm.png'),width=8,height=6,units="in",res=100)
b =(b +20)
dev.off() }
}
每次a
到达b
都会制作一个情节系列的记录。每次 a
达到 b
,b
增加 20。我愿意接受任何优化它的方法,尤其是通过删除 a 和 b 并调用一种像这样的 seq:
foo = seq(0, length(primes), by=20)
我有一个名为 primes
的向量,长度为 100,包含前一百个素数,如下所示:
primes
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109
[30] 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
[59] 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449
[88] 457 461 463 467 479 487 491 499 503 509 521 523 541
我还有一个名为 optm
的数据框,其中所有这些素数作为变量,学习率递减作为行。例如,这是我通过绘制第 37 个素数得到的:
plot.default(optm$step, optm$seed37, type = "l", ylab = "learning rate",
xlab = "first third iterations", main = 'seed37')
我想将这一百个情节提取并保存在一个 4*5 的多帧上。结果我想要 5 个文件(= 100 个图),这就是为什么我在以下循环中实现 a
作为记录限制:
a <- 20
par(mfrow = c(4, 5))
for(i in primes) {
cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
for(j in 1:length(primes)) {
if (j==a){
dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
a = a + 20
dev.off()
}
}
}
问题是我电脑上录制的文件很相似,并且具有完全相同的情节(第一个seed2)。我的错误在哪里?
编辑:
a = 0
par(mfrow = c(4, 5))
for(i in primes) { for(j in length(primes)) {cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
a = (a +1)
if(a==20) {
dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
dev.off()
}
}
}
这个模式适用于前 20 个。所以我编写了一个这样的序列:
foo = seq(0, length(primes), by=20)
现在,我需要在 if
命令中调用 foo
的任何值而不是 20。我该如何管理?
你只需要 1 个 for 循环:
a <- 20
par(mfrow = c(4, 5))
for(i in seq(length(primes))) {
cln <- paste0("seed",primes[i])
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
if (i&&a == 0){
dev.copy(png, paste0(i,'optm.png'),width=8,height=6,units="in",res=100)
dev.off()
}
}
很抱歉回答我自己的问题,但我确实找到了方法。肯定不是最好的,但以下代码有效。
a = 0
b = 20
par(mfrow = c(4, 5))
for(i in primes) {cln <- paste0("seed",i)
plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
a = (a +1)
print(a)
if (a == b) {
dev.copy(png, paste0(a,'optm.png'),width=8,height=6,units="in",res=100)
b =(b +20)
dev.off() }
}
每次a
到达b
都会制作一个情节系列的记录。每次 a
达到 b
,b
增加 20。我愿意接受任何优化它的方法,尤其是通过删除 a 和 b 并调用一种像这样的 seq:
foo = seq(0, length(primes), by=20)