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?

¿Fue útil?

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"))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top