Problema de evaluación no estándar de alcance en la fórmula glm en una función en R.
Tengo una función que calcula una tabla y un modelo (y más…):
fun <- function(x, y, formula = y ~ x, data = NULL) {
out <- list()
out$tab <- table(x, y)
out$mod <- glm(formula = formula,
family = binomial,
data = data)
out
}
En la fórmula, necesito utilizar x
e y
tal como se proporcionan en la llamada a la función (por ejemplo, x = DF1$x
e y = DF1$y
) y variables de otro marco de datos (por ejemplo, a
y b
de DF2
). Falla con mi función ingenua:
fun(x = DF1$x,
y = DF1$y,
formula = y ~ x + a + b,
data = DF2)
# Error in eval(predvars, data, env) : object 'y' not found
¿Cómo puedo hacer que glm busque x
e y
en el entorno de la función? Supongo que este problema está relacionado con la evaluación no estándar y / o el ámbito, pero no tengo idea de cómo solucionarlo.
Datos para el ejemplo:
smp <- function(x = c(TRUE, FALSE),
size = 1e2) {
sample(x = x,
size = size,
replace = TRUE)
}
DF1 <- data.frame(x = smp(),
y = smp())
DF2 <- data.frame(a = smp(x = LETTERS),
b = smp(x = LETTERS))
davy.ai
Para hacer que
glm()
busquex
ey
en el entorno de la función, podemos utilizar una evaluación no estándar con la funciónsubstitute()
. Necesitamos sustituir los nombres de los símbolos en la fórmula con sus valores en el entorno de la función antes de pasar la fórmula aglm()
. Aquí está el código de la función actualizado:“`{r}
fun <- function(x, y, formula = y ~ x, data = NULL) {
out <- list()
out$tab <- table(x, y)
# sustituir x e y en la fórmula con sus valores en el entorno de la función
formula <- substitute(formula)
formula[[2]] <- as.name(deparse(substitute(y)))
formula[[3]] <- as.name(deparse(substitute(x)))
out$mod <- glm(formula = formula,
family = binomial,
data = data)
out
}
La salida debe ser una lista que contenga una tabla y un modelo de regresión logística.