【问题标题】:Evaluate strings for regression评估字符串以进行回归
【发布时间】:2016-10-22 15:39:21
【问题描述】:

从这些字符串

data = "mtcars"
y    = "mpg"
x    = c("cyl","disp")

,我正在尝试执行线性模型。我试过像

epp=function(x) eval(parse(text=paste0(x,collapse="+")))

lm(data=epp(data),epp(y)~epp(x))
# Error in eval(expr, envir, enclos) : object 'cyl' not found

最后一行的目标是等价于

lm(data=mtcars,mpg~cyl+disp)

【问题讨论】:

  • 你会得到大量的人告诉你根本不要这样做,除非你提供一些详细的上下文,我猜这涉及某种请求数据的应用程序, x 和 y 来自用户的参数,然后运行线性模型?解释上下文可能会避免误解,并可能会带来更好的答案。
  • @joran 我的目标是制作一个为 MCMCglmm 执行逐步模型选择的函数。
  • 在这种情况下,您传递的是数据框名称的字符表示,而不是对象本身,这似乎非常奇怪。
  • 是的,你是正确的 data.frame。原因是(1)部分是为了学习和(2)在传递给函数时不必复制整个data.frame(但无论如何复制时间都可以忽略不计)。我现在改了。

标签: r eval lm evaluation expression-evaluation


【解决方案1】:

这涉及两个操作,这两个操作都在多个 SO 条目中描述,可能单独使用 getas.formula 函数:

lm(data=get(data), 
   formula=as.formula( paste( y, "~", paste(x, collapse="+") ) )
  )

在这两种情况下,您都使用文本/字符对象来返回语言对象。在第一个参数get 返回一个可以评估的“符号”,在第二个实例中as.formula 返回一个“公式”对象。 @blmoore 告诉我们 lm 将接受一个字符对象是正确的,因此这里不需要 as.formula 调用。

【讨论】:

  • 打败我!你甚至可以让lm从字符强制转换公式
  • @Remi.b:R Purity 的守护者建议我们避免使用eval(parse(...,因为它通常是在编程的宏处理模式下转换 R 的一种方法。致 blmoore:我没有意识到 NSE 已经下降到 lm 处理字符值,但我想它并没有真正造成任何歧义。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 2014-06-13
  • 2013-02-11
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多