Ho provato a utilizzare acast
da reshape2
all'interno di una funzione autodidatta, ma ho riscontrato il problema che acast non ha trovato i dati che gli ho inviato.Come usare acast (reshape2) all'interno di una funzione in R?
Ecco il mio dati:
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
allora assomiglia a questo:
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
ora posso lanciarlo di nuovo via 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
Tuttavia, quando si scrive un piccolo involucro per acast
che dovrebbe fare lo stesso, ottengo uno stupido messaggi di errore:
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
Il problema è ovviamente correlato a qualcosa come ambienti e variabili globali/locali. Come fornisce altri messaggi di errore dopo la dichiarazione di dat
nell'ambiente globale (ad esempio, v1
e v2
non trovato finché non sono globali).
desidero utilizzare resahpe (specialmente ACAST) all'interno di una funzione senza la necessità di dichiarare variabili all'esterno della funzione. Qual è il trucco?
Grazie.
Questo è un problema che si verifica più spesso negli ultimi tempi. Originariamente ho trovato che fosse un problema con i metodi S4, ma a quanto pare può verificarsi anche con altre funzioni. Questo è presumibilmente un bug in R, vedi anche le risposte a questa domanda: http://stackoverflow.com/questions/3574858/values-not-being-copied-to-the-next-local-environment/ –
Grazie Joris. Ma ora ho l'impressione che non ci sia una soluzione facile al mio problema. non troppo bello ... – Henrik
Appena scoperto ce n'è uno in realtà. È una questione di corretto typecasting. –