Übergeben von Ausdrücken an curve () innerhalb einer Funktion

8

Ein Kollege hat mich das gefragt, und ich habe damit gerungen.

Angenommen, ich möchte eine Funktion definieren, die einen Ausdruck (zB x^2 für Konkretheit) als Argument akzeptiert und dieses Argument an curve() weitergibt.

Wenn ich das einfach machen will, renne ich einfach

%Vor%

und es funktioniert gut.

Angenommen, ich versuche, eine Wrapper-Funktion einzurichten (sagen wir, es gibt noch andere Dinge, die ich zusätzlich zum Zeichnen der Kurve im Wrapper tun möchte):

%Vor%

Das funktioniert, wenn ich eine Funktion übergebe:

%Vor%

es schlägt fehl, wenn ich versuche, x^2 zu übergeben, wenn R versucht, den Ausdruck auszuwerten:

%Vor%

Ich kann versuchen, dies zu verhindern, indem ich substitute innerhalb der Funktion verwende:

%Vor%

OK, das deutet vielleicht darauf hin, dass ich es versuchen sollte

%Vor%

Für was es wert ist,

  • dies schlägt anders mit curve(h,...) ("function h not found")
  • fehl
  • es schlägt auf die gleiche Weise fehl, wenn as.call() für as.expression() ersetzt wird
  • curve() funktioniert in jedem Fall nicht mit Ausdrücken:

%Vor%

Wenn ich versuche, curve() zu debuggen, um zu sehen, was passiert, haben wir:

%Vor%

Hier sexpr ist substitute(g) , was den xname %in% all.vars(sexpr) Test fehlschlägt ...

Irgendwelche Ideen, wie man damit umgeht?

    
Ben Bolker 30.12.2014, 23:18
quelle

1 Antwort

6

Ich wollte nicht fragen-und-dann-antworten, aber ich fand die (an?) Antwort mit ein bisschen mehr herumstochern - es kam mir in den Sinn, dass ich eval noch nicht probiert hatte . eval(curve(substitute(g),from=0,to=3)) funktioniert nicht , aber das funktioniert:

%Vor%

update : @RichardScriven schlägt vor, dass do.call() auch funktionieren könnte - und tut es!

%Vor%

Weitere Erläuterungen sind willkommen!

    
Ben Bolker 30.12.2014, 23:23
quelle

Tags und Links