我有一个调用对象,我想添加一个参数,我不想以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
所以,我希望结果是一个等于lmb
的新“lm”对象,而不仅仅是一个列表。
虽然有一种解决方法,但它不使用解析(修改lm的副本以使wt =权重为默认similar to in this solution),同样不涉及编辑调用对象。 / p>
答案 0 :(得分: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
内部的内容,看看它在做什么。