2017-03-03 5 views
0

私は呼び出しオブジェクトを持っていますが、引数を追加したいので、構文解析を使用したくありませんthis answer does"call"オブジェクトの引数を変更する

だから、私は私が電話を使用して、引数、weights=wtを追加したいと言う、今lmオブジェクト、およびそのlm

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

から電話を持っていると言います。私は信じられないほど簡単に新しい呼び出しを作成する方法があることを認識しますが、私は呼び出しオブジェクトを扱うことができるのだろうかと思っています。それはそこに

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に動作しない場合weightsを編集する方法もあります。

なので、別の要素を追加してコールを単純に拡張できるはずですが、その方法はわかりません。たとえば、次は失敗:

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

ので、私はlmbに等しい新しい「LM」オブジェクトだけでなく、リストでは結果を望んでいるだろう。

回避策がありますが、構文解析(lmのコピーにwt = weightsをデフォルトとして変更するために、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のExpress:Calls:通話の変更(http://adv-r.had.co.nz/Expressions.html#callsでオンライン)のはるかに簡単なソリューションが得られます。 'cl < - lma $ call; cl $ weights < - quote(wt); eval(cl) ' 私には私が望む結果が与えられます。 –

関連する問題