2009-07-31 16 views
5

Estoy escribiendo una función que toma dos variables y las regresa por separado a cada una de ellas en un conjunto de controles expresados ​​como una fórmula unilateral. En este momento estoy usando lo siguiente para hacer la fórmula para una de las regresiones, pero se siente un poco hackeado-up:Utilizando argumentos de función en update.formula

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

prefiero hacerlo usando update.formula(), pero por supuesto update.formula(controls, x ~ .) y update.formula(controls, as.name(x) ~ .) no funciona ¿Qué debería estar haciendo?

Respuesta

5

Aquí es uno de los enfoques:

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

update(right, left_2) 

Pero yo creo que tengas a cualquiera de las cadenas de texto pasta de juntas, o usar sustituto. Que yo sepa, no hay funciones para crear una fórmula de dos lados a partir de dos fórmulas de una cara (o equivalentes similares).

+0

Me pregunto si hay una respuesta mejor ocho años después, ¿basada en quosures o en el paquete de rlang en general? – rcorty

1

No estoy seguro acerca de update.formula(), pero he utilizado el enfoque que usted toma aquí de pegar texto y convertirlo a través de as.formula en el pasado con éxito. Mi lectura de help(update.formula) no me hace pensar que puede sustituir el lado izquierdo como desee.

Por último, confíe en el mecanismo de envío. Si objeta es de tipo fórmula, simplemente llame al update que se prefiere sobre el update.formula explícito.

Cuestiones relacionadas