Wie zu verwenden acast (reshape2) innerhalb einer Funktion in R?
Habe ich versucht zu verwenden acast
aus reshape2
in einer selbst geschriebenen Funktion, hatte aber das problem, dass acast nicht zu finden die Daten, die ich senden, um es.
Hier meine Daten:
library("reshape2")
x <- data.frame(1:3, rnorm(3), rnorm(3), rnorm(3))
colnames(x) <- c("id", "var1", "var2", "var3")
y <-melt(x, id = "id", measure = c("var1", "var2", "var3"))
y
sieht dann wie folgt aus:
id variable value
1 1 var1 0.1560812
2 2 var1 1.0343844
3 3 var1 -1.4157728
4 1 var2 0.8808935
5 2 var2 0.1719239
6 3 var2 0.6723758
7 1 var3 -0.7589631
8 2 var3 1.1325995
9 3 var3 -1.5744876
nun kann ich warf es wieder über acast
:
> acast(y,y[,1] ~ y[,2])
var1 var2 var3
1 0.1560812 0.8808935 -0.7589631
2 1.0343844 0.1719239 1.1325995
3 -1.4157728 0.6723758 -1.5744876
Jedoch beim schreiben einen kleinen wrapper für acast
sollten das gleiche tun, bekomme ich eine dumme Fehlermeldungen:
wrap.acast <- function(dat, v1 = 1, v2 = 2) {
out <- acast(dat, dat[,v1] ~ dat[,v2])
return(out)
}
wrap.acast(y)
Error in eval(expr, envir, enclos) : object 'dat' not found
Das problem ist offensichtlich im Zusammenhang zu etwas, was Umgebungen und globalen/lokalen Variablen. Wie es gibt andere Fehlermeldungen nach dem deklarieren dat
im globalen Umfeld (d.h., v1
und v2
nicht gefunden, solange Sie nicht global).
Möchte ich nutzen, resahpe (vor allem acast), innerhalb einer Funktion, ohne die Notwendigkeit zu deklarieren, die Variablen außerhalb der Funktion. Was ist der trick?
Dank.
- Dies ist ein problem, das tritt häufiger auf in letzter Zeit. Ich hatte ursprünglich gefunden, dass es ein problem mit dem S4-Verfahren, aber anscheinend kann auftreten, mit anderen Funktionen zu. Dies ist vermutlich ein bug in R, siehe auch die Antworten auf diese Frage : stackoverflow.com/questions/3574858/...
- Dank Joris. Aber jetzt bekomme ich den Eindruck, dass es keine einfache Lösung für mein problem. nicht zu schön...
- Gerade herausgefunden, dass es ist eine eigentlich. Es ist eine Frage der richtigen Typisierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt mit dem Formel-Spezifikation, verwenden Sie die Zeichen Spezifikation:
Einzige Problem ist, dass Sie den Missbrauch der Formel-Schreibweise in R. Sie sollte nicht Dinge tun, wie
als die 'y' - bits sind redundant, wenn ein Daten-Objekt vorhanden ist. Wenn Sie beziehen sich auf die Variablen von y, indem Sie den Namen direkt in die Formel, Dinge, die gut funktionieren
und der code ist viel besser lesbar in dieser zweiten version.
Tun, was Sie wollen mit der
acast
wrapper wird beinhalten die Erstellung der richtigen Formel mit dernames
, als Joris weist darauf hin, und Hadley ' s Lösung ist viel einfacher. Also mein Punkt wirklich ist, zu beobachten mit wie Sie mit formula-Spezifikation in R. Sie sparen sich eine Menge ärger auf lange Sicht (wenn auch nicht speziell mit diesem problem), wenn Sie Formeln verwenden, richtig.Korrektur : problem ist nicht, dass es nicht dat, aber, dass es nicht finden dat [v1] und dat [v2] in der angegebenen Formel. Acast nimmt ein argument des Typs "Formel", und das bekommt man bewertet in einer temporären Umgebung erstellt, um Ihre Daten-frame. Innerhalb dieser Umgebung nicht gefunden wird, eine "dat" - Objekt, wenn die Funktion gewickelt ist, innerhalb einer anderen.
Ich bin mir nicht ganz folgenden, wie dies funktioniert in der globalen und nicht, wenn verpackt, aber wenn Sie füttern warfen eine Formel, es funktioniert innerhalb einer Funktion auch.
mit Ihrem Spielzeug-Daten :
Fand ich ziemlich unelegant Weg, um das problem zu lösen mit super-Zuweisungen (
<<-
).Ändern der Funktion die folgenden ist der job. Aber, es ist ziemlich hässlich, denn es schafft Globale Variablen, die bleiben.
Ich bin immer noch sehr interessiert an anderen (weniger Verstopfungen) - Lösungen.
vor der Ausführung der Funktion:
nach dem ausführen der Funktion: