Se puede utilizar Fijar mediante do.call?
Pregunta
Tengo algo de código donde es más conveniente para llamar a través de fix
do.call
, en lugar de hacerlo directamente. Cualquier trama de datos de edad va a trabajar para este ejemplo:
dfr <- data.frame(x = 1:5, y = letters[1:5])
El primer intento evidente es
do.call("fix", list(dfr))
Por desgracia, esto no funciona con
Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name
Por lo tanto, le damos un nombre:
do.call("fix", list(dfr = dfr))
Esta vez se produce un error con
Error in is.name(subx) : 'subx' is missing
Para el registro, edit
no funciona bien.
dfr <- do.call("edit", list(dfr = dfr))
Puede alguien pensar en una solución sensata, por favor?
EDIT: Después de reflexionar, me había olvidado de que fix
siempre vuelca su respuesta en el medio ambiente mundial, lo cual está bien para los ejemplos de prueba, pero no tan bueno para su uso con funciones. excelente solución de Joshua no se extiende al uso con edit
.
Para obtener puntos de bonificación, ¿cómo se llama edit
través do.call
?
Solución
Puede utilizar substitute
, que también es útil para cuando se desea utilizar nombres de variables como etiquetas.
do.call("fix",list(substitute(dfr)))
Editar para mayor claridad
Es más fácil ver cómo funciona esta utilizando el comando call
:
> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)
Por lo tanto cuando se utiliza substitute
el comando que se está creando usos del nombre del símbolo en lugar del símbolo evaluado. Si envuelve una eval
alrededor de estas expresiones se ve que el primer ejemplo da el mismo error que encontró, y el segundo ejemplo funciona como se esperaba.
Después de leer el enlace de Hadley se hace más claro de lo que se está evaluando:
> as.name("dfr")==substitute(dfr)
[1] TRUE
Otros consejos
El primer error que da una pista. Estos trabajos:
do.call(fix,list("dfr"))
Todavía obtendría el mismo error en su segundo intento, incluso si se ha utilizado dfr="dfr"
debido a que la lista denominada necesita nombres de los argumentos a what
(la función). Por lo que su segundo intento debe ser:
do.call(fix,list(x="dfr"))