R 为回归计算字符串

R 为回归计算字符串,r,eval,lm,evaluation,expression-evaluation,R,Eval,Lm,Evaluation,Expression Evaluation,从这些弦 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(d

从这些弦

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)

这涉及两个操作,这两个操作都在多个SO条目中描述,这些SO条目可能单独使用
get
as。公式
函数:

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

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

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

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

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

您将收到大量的人告诉您不要这样做,除非您提供一些详细的上下文,我猜这涉及到某种请求数据的应用程序,用户的x和y参数,然后运行线性模型?解释该上下文可能会避免误解,并可能导致更好的答案。@joran我的目标是为MCMCglmm创建一个执行逐步模型选择的函数。在这种情况下,传递数据帧名称的字符表示形式而不是对象本身似乎非常奇怪。是的,对于data.frame,您是对的。原因是(1)部分是为了学习,(2)在传递到函数时不必复制整个data.frame(但是复制时间可以忽略不计)。我现在已经改变了它。你会收到大量的人告诉你不要这样做,除非你提供一些详细的上下文,我猜这涉及到某种应用程序,从用户那里获取数据,x和y参数,然后运行一个线性模型?解释该上下文可能会避免误解,并可能导致更好的答案。@joran我的目标是为MCMCglmm创建一个执行逐步模型选择的函数。在这种情况下,传递数据帧名称的字符表示形式而不是对象本身似乎非常奇怪。是的,对于data.frame,您是对的。原因是(1)部分是为了学习,(2)在传递到函数时不必复制整个data.frame(但是复制时间可以忽略不计)。我现在已经改了,快来吧!您甚至可以让
lm
对来自的公式进行强制character@Remi.b:R纯度的监护人建议我们避免使用
eval(解析(…
因为它通常是一种在编程的宏处理模式中投射R的方法。对
blmoore
:我没有意识到NSE已经下降到
lm
字符值的处理,但我想它并不会真的产生任何歧义。让我来试试吧!你甚至可以让
lm
从charact对公式进行强制er@Remi.b:R纯度的守护者建议我们避免使用
eval(parse(…
),因为它通常是在编程的宏处理模式中转换R的一种方法。对
blmoore
:我没有意识到NSE已经下降到字符值的
lm
处理,但我想它并没有造成任何歧义。