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:
Ich kann versuchen, dies zu verhindern, indem ich substitute
innerhalb der Funktion verwende:
OK, das deutet vielleicht darauf hin, dass ich es versuchen sollte
%Vor%Für was es wert ist,
curve(h,...)
("function h
not found") 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:
Hier sexpr
ist substitute(g)
, was den xname %in% all.vars(sexpr)
Test fehlschlägt ...
Irgendwelche Ideen, wie man damit umgeht?
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:
update : @RichardScriven schlägt vor, dass do.call()
auch funktionieren könnte - und tut es!
Weitere Erläuterungen sind willkommen!
Tags und Links r