Können Sie fix über do.call verwenden?
Frage
Ich habe einige Code, wo es bequemer ist fix
über do.call
zu rufen, anstatt direkt. Alle alten Datenrahmen wird für dieses Beispiel funktionieren:
dfr <- data.frame(x = 1:5, y = letters[1:5])
Der offensichtliche erste Versuch ist
do.call("fix", list(dfr))
Leider versagt diese mit
Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name
Also, wir geben ihm einen Namen:
do.call("fix", list(dfr = dfr))
Dieses Mal scheitert es mit
Error in is.name(subx) : 'subx' is missing
Für die Aufzeichnung edit
funktioniert auch nicht.
dfr <- do.call("edit", list(dfr = dfr))
Kann jemand denken Sie an eine vernünftige Abhilfe, bitte?
EDIT: Nach einigen Überlegungen hatte ich vergessen, dass fix
immer Dumps seine Antwort in die globale Umwelt, die gut für Testbeispiele, aber nicht so gut für den Einsatz mit Funktionen. Joshuas hervorragende Abhilfe erstreckt sich nicht mit edit
zu verwenden.
Für Bonuspunkte, wie nennt man edit
über do.call
?
Lösung
Sie können mit substitute
, die auch nützlich ist, wenn Sie wollen Variablennamen als Etiketten verwenden.
do.call("fix",list(substitute(dfr)))
Bearbeiten für Klarheit
Es ist einfacher zu sehen, wie dies funktioniert, indem Sie den call
Befehl:
> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)
Wenn Sie also den Befehl substitute
, die erstellt wird, verwendet den Namen des Symbols anstatt das Symbol ausgewertet. Wenn Sie eine eval
um diese Ausdrücke wickeln sehen Sie, dass das erste Beispiel den gleichen Fehler geben Sie begegnet, und das zweite Beispiel funktioniert wie erwartet.
Nach Hadleys Link lesen wird klarer, was bewertet wird:
> as.name("dfr")==substitute(dfr)
[1] TRUE
Andere Tipps
Der erste Fehler gibt Ihnen einen Hinweis. Dies funktioniert:
do.call(fix,list("dfr"))
Sie würden immer noch die gleichen Fehler auf Ihrem zweiten Versuch bekommen, auch wenn Sie dfr="dfr"
verwendet, da die benannte Liste Namen der Argumente what
muss (die Funktion). Also Ihr zweiter Versuch sein sollte:
do.call(fix,list(x="dfr"))