2012-06-27 6 views
8

Dies kann fallen unter "Sie können nicht, und es gibt keinen Grund, wie auch immer," aber ich bin gespannt, ob es möglich ist. Zumindest wird es vielleicht ein lustiges R-Puzzle sein.Wie curry ein ... Argument nach Position in R?

Ich überlegte, currying cat immer an \n anhängen. wird jedoch so geschrieben, dass es so viele Argumente zusammenfügt, wie es angegeben ist (via ...).

Überraschenderweise funktioniert das:

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

hi 

jedoch die \n windet sich vor dem Text des Benutzers. Gibt es eine Möglichkeit, die Funktion so zu curry, dass Sie das Argument curied immer die Argumente ... enden?

+4

Curry Katze, yummmmy! – John

+1

Schlaue Antworten alle. Meine Beherrschung von 'do.call' ist unvollständig, geht aber weiter. Vielen Dank :-) –

Antwort

10

Sieht aus wie Curry() ziemlich effektiv festdrahtet die zwei Argumentlisten in umgekehrter Reihenfolge von dem, was Sie möchten. Es ist jedoch eine einfache Funktion, dass Sie einfach sein Spiegelbild konstruieren können, und verwenden Sie es stattdessen.

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

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

# 1. Ignorieren Sie das zweite Argument von Curry und hart Code der Zeilenumbruch

Versuchen Sie dies, das letzte Argument von cat durch harte Codierung in einer anonymen Funktion Curries. Es ist tatsächlich keinen Gebrauch von Curry Argumente nach dem ersten machen:

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

# 2. Funktion Herstellen durch eine anonyme Funktion

Hier currying ist eine zweite Lösung, die das letzte Argument von cat reichlichen Maße durch eine anonyme Funktion, die cat ‚s Argumente neu ordnet.

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

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

# 3. Gewünschte Funktion herstellen, indem man eine noch grundlegendere Funktion curry

Vielleicht ist der wirkliche Punkt von allem das zu sehen, wie wir grundlegende Bestandteile nehmen und sie cryry erhalten können, was wir wollen. So konnten wir eine allgemeine last.arg.fun definieren und dann von einem Curry davon die gewünschte Funktion herstellen:

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") 

Wir haben es in zwei Schritten tun könnten, wenn wir last.arg.cat irgendwann benötigt:

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") 

Beachten Sie, dass Jeder der Tests sollte eine Zeile erzeugen, die besagt, dass dort eine neue Zeile endet.

EDIT: mehr Lösungen.