Próbowałem użyć acast
z reshape2
w ramach funkcji napisanej samodzielnie, ale miałem problem z tym, że acast nie znalazł danych, które do niego wysłałem.Jak używać acast (reshape2) w funkcji w R?
Oto moje dane:
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
wówczas wygląda następująco:
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
teraz mogę rzucać go z powrotem poprzez 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
Jednak podczas pisania małe opakowanie dla acast
, które powinno zrobić to samo, mam głupie komunikaty o błędach:
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
Problem jest oczywiście związany z czymś takim jak środowiska i zmienne globalne/lokalne. Ponieważ nie podaje innych komunikatów o błędach po stwierdzeniu, że dat
w środowisku globalnym (tj. v1
i v2
nie zostaną znalezione, dopóki nie są globalne).
Chciałbym użyć resahpe (szczególnie acast) w funkcji bez konieczności zadeklarowania zmiennych poza funkcją. Jaka jest sztuczka?
Dzięki.
Jest to problem, który występuje częściej w ostatnim czasie. Początkowo odkryłem, że jest to problem z metodami S4, ale najwyraźniej może również wystąpić z innymi funkcjami. Jest to podobno błąd w R, zobacz także odpowiedzi na to pytanie: http://stackoverflow.com/questions/3574858/values-not-being-copied-to-the-next-local-environment/ –
Dzięki Joris. Ale teraz mam wrażenie, że nie ma łatwego rozwiązania mojego problemu. niezbyt miły ... – Henrik
Właśnie się dowiedziałem, że jest jeden. To kwestia prawidłowego typowania. –