For循环调用不同的函数变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了For循环调用不同的函数变量相关的知识,希望对你有一定的参考价值。

我想用不同的模型调用predict函数来提取其预测值。我尝试使用paste0来调用正确的模型,但它不起作用,例如:

model0 = lm(mpg ~ cyl + disp, data = mtcars)
model1 = lm(mpg ~ hp + drat, data = mtcars)
model2 = lm(mpg ~ wt + qsec, data = mtcars)

testdat0 = data.frame(cyl = 6, disp = 200)
testdat1 = data.frame(hp = 100, drat = 4)
testdat2 = data.frame(wt = 4, qsec = 20)

res = NULL
for (i in 1:3) {
  res = rbind(res, c(i-1, predict(paste0('model',i-1), newdata = paste0('testdat0',i-1))))
}

手动完成

rbind(c(0, predict(model0, newdata = testdat0)), 
      c(1, predict(model1, newdata = testdat1)), 
      c(2, predict(model2, newdata = testdat2)))

              1
[1,] 0 21.02061
[2,] 1 24.40383
[3,] 2 18.13825

我想到这样做的另一种方法是将模型和testdata放在2个单独的list()中并使用for循环来调用它们,但这也没有用。还有其他方法可以做到这一点,还是我做错了什么.. TIA

答案

我使用list和sapply解决你的问题,所以我们不需要反复定义一个外部变量和rbind()

model0 = lm(mpg ~ cyl + disp, data = mtcars)
model1 = lm(mpg ~ hp + drat, data = mtcars)
model2 = lm(mpg ~ wt + qsec, data = mtcars)

testdat0 = data.frame(cyl = 6, disp = 200)
testdat1 = data.frame(hp = 100, drat = 4)
testdat2 = data.frame(wt = 4, qsec = 20)

#make list from sample data
data <- list(dat0=list(model=model0,test=testdat0),
             dat1=list(model=model1,test=testdat1),
             dat2=list(model=model2,test=testdat2))

#sapply over list, automatically converts to matrix
res <- sapply(data,function(dat) predict(dat$model,newdata=dat$test) )

> res
  dat0   dat1   dat2 
21.02061 24.40383 18.13825 

另一答案

要使for循环工作,您可以进行以下更改:

res = NULL
for (i in 1:3) {
  res = rbind(res, c(i-1, predict(eval(as.name(paste0('model',i-1)))), newdata = eval(as.name(paste0('testdat',i-1)))))
}

以上是关于For循环调用不同的函数变量的主要内容,如果未能解决你的问题,请参考以下文章

为什么'I'在不同的函数中更改嵌套循环?

在游标中调用函数 for 循环

BATCH - 在 for 循环中调用的函数不返回值

Python函数的定义(构造)和调用

JS中for...in 语句用于对数组或者对象的属性进行循环操作吗?

我可以在 JavaScript 的不同 for 循环中声明相同的变量两次吗? [复制]