2016-10-22 117 views
1

串从这些字符串评估回归

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) 
+0

你会得到大量的人告诉你只是不这样做,除非你提供一些详细的上下文,我会猜测涉及某种应用程序,请求数据,x和y参数从用户,然后运行线性模型?解释这种背景可能会阻止误解,并可能导致更好的答案。 – joran

+0

@joran我的目标是为MCMCglmm执行逐步模型选择的功能。 –

+0

在这种情况下,你会传递一个数据框名称的字符表示而不是对象本身,这似乎很奇怪。 – joran

回答

4

这包括那些在单独使用也许无论是getas.formula功能的多个SO条目都描述了两个操作的东西:

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

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

+0

打我吧!你甚至可以让'lm'完成强制来从角色 – blmoore

+0

@ Remi.b中提取公式:R Purity的守护者建议我们避免使用'eval(parse(...',因为它通常是一种将R投射到宏中的方法“blmoore”:我没有意识到NSE已经进入了字符值的lm处理过程,但我想这并没有造成任何含糊之处。 –