2017-03-03 33 views
0

我有一個調用對象,我想添加一個參數,並且我不想使用解析方式this answer does更改「調用」對象中的參數

所以,說我有一個lm對象,所以從lm

lma <- lm(mpg ~ cyl, data=mtcars) 
lma$call 
# lm(formula = mpg ~ cyl, data = mtcars) 

現在的口號,說我想補充的說法,weights=wt,使用呼叫。我意識到有一個非常簡單的方法來創建一個新的通話,但我想知道我是否可以使用一個通話對象。也有編輯weights如果它已經在那裏

lmb <- lm(mpg ~ cyl, data=mtcars, wei=wt) 
cl <- lmb$call 
wtpos <- which.max(pmatch(names(cl), "weights")) 
cl[[wtpos]] <- mtcars$qsec 
eval(cl) 

但因爲在lma$call沒有權重的說法,這將不會對lma$call工作的方式。

所以,感覺就像我應該能夠通過添加另一個元素來簡單地「增長」這個調用,但是我不知道該怎麼做。例如,下面的失敗:

cl <- lma$call 
cl <- c(cl, weights=quote(wt)) 
eval(cl) 
# [[1]] 
# lm(formula = mpg ~ cyl, data = mtcars) 
# 
# $weights 
# wt 

,我就希望得到的結果是一個新的「LM」對象等於lmb,不只是一個列表。

儘管有一種解決方法,那就是不使用解析(修改lm的副本使wt =權重爲缺省值similar to in this solution),這同樣不涉及編輯調用對象。

回答

1

我相信pryr包提供了一些有用的功能操縱呼叫:

lma <- lm(mpg ~ cyl, data=mtcars) 
lm_call <- lma$call 

library(pryr) 
modify_call(lm_call,list(weights = runif(32))) 

> lm_call2 <- modify_call(lm_call,list(weights = runif(32))) 
> eval(lm_call2) 

Call: 
lm(formula = mpg ~ cyl, data = mtcars, weights = c(0.934802365722135, 
0.983909613220021, 0.762353664264083, 0.23217184189707, 0.850970500381663, 
0.430563687346876, 0.962665138067678, 0.318865151610225, 0.697970792884007, 
0.389103061752394, 0.824285467388108, 0.676439745584503, 0.344414771301672, 
0.292265978176147, 0.925716639030725, 0.517001488478854, 0.726312294835225, 
0.842773627489805, 0.669753148220479, 0.618112818570808, 0.139365098671988, 
0.843711007386446, 0.851153723662719, 0.134744396666065, 0.92681276681833, 
0.00274682720191777, 0.732672147220001, 0.4184603120666, 0.0912447033915669, 
0.427389309043065, 0.721000595251098, 0.614837386412546)) 

Coefficients: 
(Intercept)   cyl 
    38.508  -2.945 

你可以看看裏面pryr::modify_call,看看它在做什麼,如果你想手工做的,我想。

+0

感謝您的提示。在Wickham的Advanced R下的Expressions:Calls:修改一個調用(在線地址爲http://adv-r.had.co.nz/Expressions.html#calls),尋找這個結果將導致更簡單的解決方案。 'cl < - lma $ call; cl $ weights < - quote(wt); eval(cl)' 給了我想要的結果。 –