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?

War es hilfreich?

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"))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top