Supongamos que tengo una siguiente fórmula:¿Cómo seleccionar una parte de fórmula en fórmula en R?
fr <- formula(y~myfun(x)+z)
objeto dado fr
hay una función en R que devuelve myfun(x)
? Escribí mi propia función (código a continuación) que básicamente hace lo que necesito, pero ¿hay alguna forma estándar de hacerlo?
La código para mi función de:
selectmds <- function(expr,funcn) {
if(length(expr)>2) {
a <- expr[[2]]
b <- expr[[3]]
if(length(a)>1) {
if(as.name(a[[1]])==funcn) {
if(length(grep(funcn,all.names(b)))>0) {
return(list(a,selectmds(b,funcn)))
}
else return(list(a))
}
}
if(length(b)>1) {
if(as.name(b[[1]])==funcn) {
if(length(grep(funcn,all.names(a)))>0) {
return(list(b,selectmds(a,funcn)))
}
else return(list(b))
}
}
for(i in 2:length(expr)) {
if(length(grep(funcn,all.names(expr[[i]])))>0)return(selectmds(expr[[i]],funcn))
}
}
return(NULL)
}
Aquí hay varios ejemplos:
> selectmds(formula(y~myfun(x)+z),"myfun")
[[1]]
myfun(x)
> unlist(selectmds(formula(y~myfun(x)+z+myfun(zz)),"myfun"))
[[1]]
myfun(zz)
[[2]]
myfun(x)
Bastante cerca de lo que estaba buscando. Analizar fórmulas es divertido, pero es bueno tener a alguien más para analizarlas :) – mpiktas
Me pregunto: quizás haya una forma de devolver la definición de 'f' como un objeto de cadena, es decir,' fname <- "fórmula (y ~ myfun (cosas) + z) "'. Entonces puedes hacer un 'grep' para todo entre" ~ "y") ". –
@CarlWitthoft, necesito las cosas entre paréntesis también. Convertir la fórmula en cadena y usar grep no es una buena idea en mi opinión. – mpiktas