R 控制Lappy调用的函数中whithin提供给lm()的参数的作用域

R 控制Lappy调用的函数中whithin提供给lm()的参数的作用域,r,lm,scoping,R,Lm,Scoping,我有一个函数,它获取一个数据集,提取不同的变量,然后从这些变量中建立线性模型(它期望在最后一列中得到响应)。我希望调用这些模型的data参数在全局环境中使用对象,以便我可以使用此函数之外的其他函数来操作它们。下面给出了提供单个数据集时的预期行为 make_mods <- function(dataset) { make_mod <- function(x){ response <- names(dataset)[length(dataset)] form &

我有一个函数,它获取一个数据集,提取不同的变量,然后从这些变量中建立线性模型(它期望在最后一列中得到响应)。我希望调用这些模型的
data
参数在全局环境中使用对象,以便我可以使用此函数之外的其他函数来操作它们。下面给出了提供单个数据集时的预期行为

make_mods <- function(dataset) {
  make_mod <- function(x){
    response <- names(dataset)[length(dataset)]
    form <- paste0(response, " ~ ", x)
    form <- as.formula(form)
    bquote( lm(.(form), data = .(d_sub)) ) # Unevaluated to show output
  }
  d_sub <- substitute(dataset)
  vars <- names(dataset)[-length(dataset)]
  mods <- lapply(vars, make_mod)
  return(mods)
}

# Make some different datasets
ex1 <- ex2 <- ex3 <- mtcars[c(3,4,6,1)] 
new_data <- function(x) {
  x + rnorm(length(x), mean = 0, sd = sd(x))
}
ex2[-length(ex2)] <- lapply(ex2[-length(ex2)], new_data)
ex3[-length(ex3)] <- lapply(ex3[-length(ex3)], new_data)

make_mods(ex1)

但是在这里,模型调用最终看起来是这样的:
lm(mpg~disp,data=X[[i]])
,当然,这个模型调用不会在默认环境中求值(实际函数会在函数中求值模型调用)。所需的输出是一个模型列表,如下所示:
lm(mpg~disp,data=ex_l[[“ex1”]])
,也就是说,它们具有引用全局环境中数据帧的
data
参数的有效调用

make_mods <- function(dataset) {
  make_mod <- function(x){
    response <- names(dataset)[length(dataset)]
    form <- paste0(response, " ~ ", x)
    form <- as.formula(form)
    bquote( lm(.(form), data = .(d_sub)) )
  }
  if(is.call(dataset)) {
    d_sub <- dataset
    dataset <- eval(dataset)
  } else {
    d_sub <- substitute(dataset)
  }
  vars <- names(dataset)[-length(dataset)]
  mods <- lapply(vars, make_mod)
  return(mods)
}

我曾经尝试过将名称传递给
lappy
以及从
lappy
调用
make_mods
的不同包装函数,但它似乎是我的函数,在使用
substitute
时,仅在从全局环境调用时提供预期行为。我不熟悉范围界定和环境当从全局环境传递数据帧时,以及从
lappy
内部传递数据帧时,我如何让我的函数给出所需的
lm
调用。我唯一能想到的是在make mods函数中添加一个if语句,测试输入是否为调用。如果它是一个调用,它希望它是对全局环境中的数据集的调用

make_mods <- function(dataset) {
  make_mod <- function(x){
    response <- names(dataset)[length(dataset)]
    form <- paste0(response, " ~ ", x)
    form <- as.formula(form)
    bquote( lm(.(form), data = .(d_sub)) )
  }
  if(is.call(dataset)) {
    d_sub <- dataset
    dataset <- eval(dataset)
  } else {
    d_sub <- substitute(dataset)
  }
  vars <- names(dataset)[-length(dataset)]
  mods <- lapply(vars, make_mod)
  return(mods)
}
这就给了我:

$ex1
$ex1[[1]]
lm(mpg ~ disp, data = ex_l[["ex1"]])

$ex1[[2]]
lm(mpg ~ hp, data = ex_l[["ex1"]])  

$ex1[[3]]
lm(mpg ~ wt, data = ex_l[["ex1"]])

<<output truncated>>
$ex1
$ex1[[1]]
lm(mpg~disp,data=ex_l[[“ex1”]]
$ex1[[2]]
lm(mpg~hp,data=ex_l[[“ex1”]]
$ex1[[3]]
lm(mpg~wt,data=ex_l[[“ex1”]]
也许不是一个优雅的解决方案,但它正在发挥作用

$ex1
$ex1[[1]]
lm(mpg ~ disp, data = ex_l[["ex1"]])

$ex1[[2]]
lm(mpg ~ hp, data = ex_l[["ex1"]])  

$ex1[[3]]
lm(mpg ~ wt, data = ex_l[["ex1"]])

<<output truncated>>