Duplicar posible:
How to write an R function that evaluates an expression within a data-frame¿Por qué no funciona la evaluación perezosa en esta función R?
Quiero escribir una función que ordena una hoja.de.datos - en lugar de utilizar el orden engorroso(). Teniendo en cuenta algo así como
> x=data.frame(a=c(5,6,7),b=c(3,5,1))
> x
a b
1 5 3
2 6 5
3 7 1
quiero decir algo como:
sort.df(x,b)
Así que aquí está mi función:
sort.df <- function(df, ...) {
with(df, df[order(...),])
}
Yo estaba muy orgulloso de esto. Dada la evaluación perezosa de R, calculé que el parámetro ... solo se evaluaría cuando fuera necesario, y para ese momento estaría dentro del alcance, debido a 'con'.
Si ejecuto la línea 'con' directamente, funciona. Pero la función no.
> with(x,x[order(b),])
a b
3 7 1
1 5 3
2 6 5
> sort.df(x,b)
Error in order(...) : object 'b' not found
¿Qué problema hay y cómo solucionarlo? Veo este tipo de "magia" frecuentemente en paquetes como plyr, por ejemplo. ¿Cuál es el truco?
sort.df (x, x $ b) funciona, pero todavía no tengo idea de qué tipo. df (x, b) no funciona – Ali
Ver también 'plyr :: arrange' que hace exactamente esto. – hadley
¡Gracias! No sabía acerca de organizar a pesar de usar plyr todos los días. Otro ejemplo más de que es difícil encontrar las soluciones correctas en el mundo R, y gran parte de la buena programación R es aprender las mejores prácticas con unos pocos paquetes buenos. –