r - R - 如何将公式传递给 with(data, lm(y ~ x)) 构造
问题描述
这个问题与R 高度相关 - 如何将公式传递给函数内部的 with(df, glm(y ~ x)) 构造,但提出了一个更广泛的问题。
为什么这些表达式有效?
text_obj <- "mpg ~ cyl"
form_obj <- as.formula(text_obj)
with(mtcars, lm(mpg ~ cyl))
with(mtcars, lm(as.formula(text_obj)))
lm(form_obj, data = mtcars)
但不是这个?
with(mtcars, lm(form_obj))
Error in eval(predvars, data, env) : object 'mpg' not found
我通常会使用该参数,但这在包data
中是不可能的。mice
IE。
library(mice)
mtcars[5, 5] <- NA # introduce a missing value to be imputed
mtcars.imp = mice(mtcars, m = 5)
这些不起作用
lm(form_obj, data = mtcars.imp)
with(mtcars.imp, lm(form.obj))
但这确实
with(mtcars.imp, lm(as.formula(text_obj)))
因此,总是这样在as.formula
函数内部使用参数,而不是先构造它然后将它传入,是不是更好?
解决方案
公式的一个重要“隐藏”方面是它们相关的环境。
创建时form_obj
,其环境设置为form_obj
创建位置:
environment(form_obj)
# <environment: R_GlobalEnv>
对于每个其他版本,公式的环境都是从内部创建的with()
,并设置为该临时环境。as.formula
通过将其分为几个步骤,使用该方法最容易看到这一点:
with(mtcars, {
f = as.formula(text_obj)
print(environment(f))
lm(f)
})
# <environment: 0x7fbb68b08588>
我们可以form_obj
通过在调用之前编辑其环境来使该方法起作用lm
:
with(mtcars, {
# set form_obj's environment to the current one
environment(form_obj) = environment()
lm(form_obj)
})
的帮助页面?formula
有点长,但是有一个关于环境的部分:
环境
公式对象具有关联的环境,并且此环境(而不是父环境)用于
model.frame
评估在提供的数据参数中找不到的变量。使用运算符创建的公式
~
使用创建它们的环境。创建的公式as.formula
将使用env
其环境的参数。
结果是,制定一个公式,~
将环境部分放在“地毯下”——在更一般的设置中,使用它更安全,它as.formula
可以让您更全面地控制公式适用的环境。
您还可以查看 Hadley 关于环境的章节:
推荐阅读
- linux - 打印部分字符串的命令?
- java - OnClick 后活动关闭
- selenium - WebDriverException:消息:无效参数:无法终止 Docker 容器中的退出进程返回奇怪的错误
- java - 将国家域功能转换为 Java8 Lambda
- ansible - 在任务文件上使用 `vars_prompt`
- javascript - JavaScript:如何使用 fillRect 用 Canvas 绘制多个矩形?
- javascript - 如何在数组中以 5 分钟为间隔获取最后几个小时 - MySQL 时间戳格式?
- mongodb - 如何在 mongo.conf 中设置 internalQueryExecMaxBlockingSortBytes
- android - 如何在点击底部导航时禁用从中心到边缘的灰色动画
- javascript - 链接 redux 连接 mapStateToProps ,以访问 mapDispatchToProps 中的道具