2015-02-04 17 views
6

Ich versuche, eine Variable zu verwenden, die einen Funktionsnamen als Zeichenkette speichert, um eine Kurve zu zeichnen. Etwas wie folgt aus:Übergeben Sie den Ausdruck als Variable an die Kurve

f1 <- function(x) 0*x 
f2 <- function(x) 1 + 0*x 
f3 <- function(x) 2 + 0*x 

fn <- "f1" 

plot.new() 
plot.window(xlim = c(0, 1), ylim = c(-1, 3)) 

curve(get(fn), add = TRUE) 
Error in curve(get(fn), add = TRUE) : 
    'expr' must be a function, or a call or an expression containing 'x' 

curve(f1, add = TRUE) 
curve(f2, add = TRUE) 
curve(f3, add = TRUE) 

Ich weiß, ich bin etwas fehlt, mit wie curve die Ausdrücke mit Ersatzgriffe, oder wie get die Funktion ist vorbei. Ich bin besonders verwirrt, weil class(get(fn)) "Funktion" zurückgibt.

Antwort

8

Nun, das Problem ist, dass curve() nicht bewertet den Parameter übergeben Sie. Es sieht, was Sie an den Parameter übergeben, nicht die Ergebnisse der Auswertung des Parameters. Wenn Sie run

curve(fn) 

was Sie übergeben, ist ein "Name" (oder "Symbol"). Das löst die Funktion aus, um die Funktion mit diesem Namen zu finden. Beim Ausführen

curve(get("f1")) #error 

haben Sie in einem Anruf übergeben. Auch dieser Aufruf wird nicht von der Kurve ausgeführt, um zu sehen, dass sie eine Funktion zurückgibt. Wie die Fehlermeldung besagt, wenn Sie einen Anruf übergeben, sollte dieser Ausdruck x enthalten. Zum Beispiel

curve(f1(x)) 

ist ein Beispiel für den Anruf mit der Syntax x Variable.

Wenn Sie die Funktion wirklich als Zeichenvektor angeben müssen, können Sie das Zeichen in ein name-Objekt konvertieren und dann den Aufruf für die Kurve mit do.call erstellen. Zum Beispiel

do.call("curve",list(as.name(fn))) 

oder Sie können Ihren Anruf auslösen, die sich ergebende Funktion mit der speziellen x Variable

curve(get(fn)(x)) 
+0

Und wenn man wollte zusätzliche Argumente hinzufügen, wie 'add = true' ändern, würde es sieht so aus: 'do.call (curve, list (as.name (fn), add = TRUE))' –

+1

Sie können das Problem auch umgehen, indem Sie zuerst die Auswertung '{get (fn) -> f; curve (f, add = WAHR)} ' –

Verwandte Themen