2012-06-27 9 views
8

Esto puede caer en "no se puede, y no hay ninguna razón para hacerlo", pero tengo curiosidad si es posible. Por lo menos, tal vez sea un rompecabezas R divertido.Cómo curry a ... argumento por posición en R?

Estaba pensando currying cat siempre anexar \n. Sin embargo, cat está escrito para que pegue tantos argumentos como se le dé (a través de ...).

Sorprendentemente, esto funciona:

> library(functional) 
> catnip <- Curry(cat, "\n") 
> catnip("hi") 

hi 

Sin embargo, el \n termina antes de texto del usuario. ¿Hay alguna forma de curry para que la función especifique que el argumento curried siempre termina con los argumentos ...?

+4

¡Gato al curry, yummmy! – John

+1

Nifty responde a todas. Mi dominio de 'do.call' es incompleto pero progresa. Gracias :-) –

Respuesta

10

Parece que Curry() conecta de manera efectiva las dos listas de argumentos en el orden opuesto al que desea. Sin embargo, es una función bastante simple, que puedes construir su imagen espejo y usarla en su lugar.

Curry2 <- function(FUN, ...) { 
    .orig = list(...) 
    function(...) do.call(FUN, c(list(...), .orig)) 
} 

catnip <- Curry2(cat, "\n") 
catnip("hi") 
7

# 1. Ignore el segundo argumento de Curry y codifique la nueva línea

Pruebe esto que curry el último argumento de cat codificándolo con una función anónima. En realidad, no hacen uso de Curry argumentos después de la primera:

catnip <- Curry(function(...) cat(..., "\n")) 

# 2. Fabricación función por ganarse una función anónima

Aquí está una segunda solución que curte el último argumento de cat mediante el uso de una función anónima que reordena los argumentos cat 's.

catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n") 

# test 
catnip2("hi", "there") 

# 3. Fabricación de la función deseada currying una función aún más básica

Quizás el verdadero objetivo de todo esto es ver cómo podemos tomar los componentes básicos y curry para obtener lo que queremos. Así podríamos definir un general last.arg.fun y luego fabricar la función deseada por un curry de ella:

last.arg.fun <- function(FUN, last.arg, ...) FUN(..., last.arg) 
catnip3 <- Curry(last.arg.fun, cat, "\n") 

# test 
last.arg.fun(cat, "\n", "hi", "there") 

# test 
catnip3("hi", "there") 

Podríamos hacerlo en dos pasos si necesitábamos last.arg.cat en algún momento:

last.arg.cat <- Curry(last.arg.fun, cat) 
catnip4 <- Curry(last.arg.cat, "\n") 

# test 
last.arg.cat("\n", "hi", "there") 

# test 
catnip4("hi", "there") 

Tenga en cuenta que cada una de las pruebas debería producir una línea diciendo hola allí terminó en una nueva línea.

EDITAR: más soluciones.

Cuestiones relacionadas