【问题标题】:Change arguments in a "call" object更改“调用”对象中的参数
【发布时间】:2017-03-03 16:55:56
【问题描述】:

我有一个调用对象,我想添加一个参数,我不想像this answer does那样使用parse。

假设我有一个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,而不仅仅是一个列表。

虽然有一种解决方法,但它不使用 parse(修改 lm 的副本以将 wt=weights 作为默认 similar to in this solution),这又不涉及编辑调用对象。

【问题讨论】:

    标签: r


    【解决方案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 内部,看看它在做什么。

    【讨论】:

    • 感谢您的提示。在 Wickham 的 Advanced R 中的 Expressions:Calls:Modifying a call(在线 adv-r.had.co.nz/Expressions.html#calls)下搜索这个会导致一个更简单的解决方案。 cl &lt;- lma$call; cl$weights &lt;- quote(wt); eval(cl) 给了我想要的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多