在函数中包装Boot调用会产生错误

时间:2019-02-26 20:17:05

标签: r

R中,生成一些虚假数据:

x1 <- runif(100)
y1 <- 2*x1 + runif(100)

产生线性模型,并将其传递给Boot包中的car

fit1 <- lm(y1 ~ x1)
Boot(fit1)

没问题。现在,将相同的代码包装在一个函数中。

do_boot <- function(x,y) {
  fit <- lm(y ~ x)
  Boot(fit)
}
do_boot(x1,y1)

这会产生错误

Error in eval(predvars, data, env) : object 'y' not found

为什么?

1 个答案:

答案 0 :(得分:2)

出于某种原因,我无法解释(也许是因为内部Boot是如何工作的),因此需要将数据存储在全局环境中。看到错误:

您可以将数据分配给全局环境:

library(car)

x1 <- runif(100)
y1 <- 2*x1 + runif(100)

do_boot <- function(x,y) {
  assign("x",x,envir=parent.frame())
  assign("y",y,envir=parent.frame())
  fit <- lm(y ~ x)
  Boot(fit)
  rm(x)
  rm(y)
}

do_boot(x1,y1)

或直接使用它们:

library(car)

x1 <- runif(100)
y1 <- 2*x1 + runif(100)

do_boot <- function() {
  fit <- lm(y1 ~ x1)
  Boot(fit)

}

do_boot()

对我来说,这两种解决方案都怪异而笨拙。不过,我更喜欢第一个。