53

他のすべての関数は、数式オブジェクトを受け取り、内部のどこかで暗黒の魔法を行っているようで、私はうらやましいです。

複数のモデルに適合する関数を書いています。これらのモデルの式の一部は同じままで、一部はモデルごとに異なります。不器用な方法は、ユーザーに式の部分を文字列として入力させ、それらに対して何らかの文字操作を行ってから、 を使用することas.formulaです。

しかし、そのルートに進む前に、関数が標準の R 形式 (たとえば、他の式を使用するオブジェクトから抽出された) の式を受け入れることができるようにする、よりクリーンな方法を見落としていないことを確認したいだけです。

次のようなものが欲しい...

> LHS <- y~1; RHS <- ~a+b; c(LHS,RHS);
y ~ a + b
> RHS2 <- ~c;
> c(LHS, RHS, RHS2);
y ~ a + b + c

また...

> LHS + RHS;
y ~ a + b
> LHS + RHS + RHS2;
y ~ a + b + c

...しかし、残念ながらどちらの構文も機能しません。何かがあるかどうか誰かが知っていますか?ありがとう。

4

1 に答える 1

73

reformulateあなたが望むことをします。

reformulate(termlabels = c('x','z'), response = 'y')
## y ~ x + z

またはインターセプトなし

reformulate(termlabels = c('x','z'), response = 'y', intercept = FALSE)
## y ~ x + z - 1

reponses次のような複数の式を作成することはできないことに注意してください。x+y ~z+b

reformulate(termlabels = c('x','y'), response = c('z','b'))
z ~ x + y

既存の用語から用語を抽出するにはformula(例を指定して)

attr(terms(RHS), 'term.labels')
## [1] "a" "b"

応答を取得する方法は少し異なります。単純なアプローチです(単一の変数応答の場合)。

as.character(LHS)[2]
## [1] 'y'


combine_formula <- function(LHS, RHS){
  .terms <- lapply(RHS, terms)
  new_terms <- unique(unlist(lapply(.terms, attr, which = 'term.labels')))
  response <- as.character(LHS)[2]

  reformulate(new_terms, response)


}


combine_formula(LHS, list(RHS, RHS2))

## y ~ a + b + c
## <environment: 0x577fb908>

応答を文字ベクトルとして指定する方が賢明だと思います。

combine_formula2 <- function(response, RHS, intercept = TRUE){
  .terms <- lapply(RHS, terms)
  new_terms <- unique(unlist(lapply(.terms, attr, which = 'term.labels')))
  response <- as.character(LHS)[2]

  reformulate(new_terms, response, intercept)


}
combine_formula2('y', list(RHS, RHS2))

数式を操作する演算子を定義することもできます+(数式オブジェクトの新しいメソッドの設定を更新します)

`+.formula` <- function(e1,e2){
  .terms <- lapply(c(e1,e2), terms)
  reformulate(unique(unlist(lapply(.terms, attr, which = 'term.labels'))))
}

RHS + RHS2
## ~a + b + c

update.formula使い勝手も.良いです

 update(~a+b, y ~ .)
 ##  y~a+b
于 2012-10-19T05:22:22.290 に答える