2016-10-22 152 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處理過程,但我想這並沒有造成任何含糊之處。 –