2009-07-31 9 views
5

J'écris une fonction qui prend deux variables et les régresse séparément sur un ensemble de contrôles exprimé comme une formule unilatérale. En ce moment, j'utilise ce qui suit pour faire la formule pour l'une des régressions, mais il se sent un peu piraté-up:Utilisation des arguments de fonction dans update.formula

foo <- function(x, y, controls) { 
    cl <- match.call() 
    xn <- cl[["x"]] 
    xf <- as.formula(paste(xn, deparse(controls))) 
} 

je préférerais le faire en utilisant update.formula(), mais bien sûr update.formula(controls, x ~ .) et update.formula(controls, as.name(x) ~ .) ne fonctionne pas. Que devrais-je faire?

Répondre

5

est ici une approche:

right <- ~ a + b + c 
left <- ~ y 
left_2 <- substitute(left ~ ., list(left = left[[2]])) 

update(right, left_2) 

Mais je pense que vous devrez soit des chaînes de texte coller ensemble, ou l'utilisation de remplacement. Au meilleur de ma connaissance, il n'y a pas de fonctions pour créer une formule à deux faces à partir de deux formules unilatérales (ou équivalents similaires).

+0

Je me demande s'il y a une meilleure réponse huit ans plus tard, basée sur des quosures ou le paquet rlang en général? – rcorty

1

Je ne suis pas sûr de update.formula(), mais j'ai utilisé l'approche que vous prenez ici de coller du texte et de le convertir via as.formula dans le passé avec succès. Ma lecture de help(update.formula) ne me fait pas penser que vous pouvez substituer le côté gauche comme vous le désirez.

Enfin, faites confiance au mécanisme de répartition. Si votre objet est de type, appelez update, ce qui est préférable à update.formula explicite.