我正在研究一个代码,它将计算一个包含多个参数的统计模型,我想在途中进行更改。然后,根据模型的性能,我会选择最好的一个。
我写了一些伪代码,说明了问题:
## vectors with values of parameters
const1 <- c(300, 500)
const2 <- c(1, 2, 3, 4, 5)
const3 <- c(30, 50, 70, 90, 110, 130)
## loop counter
i = 1
for (j in 1:length(const1)){
for (k in 1:length(const2)){
for (l in 1:length(const3)){
## i-th model
model <- stat.model(x = train,
y = target,
param1 = const1,
param2 = const2,
param3 = const3)
## ... outputing model results to a data table
## printing the number of iteration
cat("iteration =", i)
i <- i+1
## calling garbage collector to assure free space in RAM
gc()
}
}
}
正如你所看到的,我使用嵌套的“for”循环,这可能不是R中最有效的编程方式。有没有办法缩短处理时间(并且可能保存代码的易读性)?
答案 0 :(得分:2)
您可以使用lapply语句为您的伪代码
矢量化您的操作model <- function(x,y,z){x+y+z}
lapply(const1,function(x){
lapply(const2,function(y){
lapply(const3,function(z){model(x,y,z)})})})
答案 1 :(得分:1)
R
中R
循环的速度。在for
中,使用嵌套vector()
- 循环的主要问题是可读性(也许还有内存分配)。因此,如果您事先知道输出的长度,请使用lapply
创建此长度的存储对象,或者只需调用vapply
或for
。 R
循环本身的速度不是expand.grid
中的严重问题。
对于您的示例,您可以通过在三个向量上调用for
来创建您想要使用的所有可能组合,对于这三个向量,您使用三个不同的嵌套combis <- expand.grid(const1 = const1,
const2 = const2,
const3 = const3)
combis <- combis[order(combis$const1, combis$const2, combis$const3), ]
lapply(seq_len(nrow(combis)), FUN = function(i) {
model <- stat.model(x = train,
y = target,
param1 = combis[i, "const1"],
param2 = combis[i, "const2"],
param3 = combis[i, "const3"])
model
})
- 循环这样:
lapply
如果您有多个核心可供使用,则可以使用parallel软件包中的mclapply
轻松将任何mc.cores
“循环”转换为并行版本。然后,您可以通过{{1}}参数指定核心数。这使您可以轻松地并行化循环。