Indirizzamento xey in ae per numero variabile

Devo disegnare un diagramma a dispersione con l’indirizzamento delle variabili in base ai loro numeri di colonna invece di nomi, cioè invece di ggplot(dat, aes(x=Var1, y=Var2)) Ho bisogno di qualcosa come ggplot(dat, aes(x=dat[,1], y=dat[,2])) . (Dico “qualcosa” perché quest’ultimo non funziona).

Ecco il mio codice:

 showplot1<-function(indata, inx, iny){ dat<-indata print(nrow(dat)); # this is just to show that object 'dat' is defined p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny])) p + geom_point(size=4, alpha = 0.5) } testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) showplot1(indata=testdata, inx=2, iny=3) 
 # Error in eval(expr, envir, enclos) : object 'dat' not found 

Suggerisco caldamente di usare aes_q invece di passare i vettori ad aes (la risposta di @ Arun). Potrebbe sembrare un po ‘più complicato, ma è più flessibile, ad esempio aggiornando i dati.

 showplot1 < - function(indata, inx, iny){ p <- ggplot(indata, aes_q(x = as.name(names(indata)[inx]), y = as.name(names(indata)[iny]))) p + geom_point(size=4, alpha = 0.5) } 

Ed ecco il motivo per cui è preferibile:

 # test data (using non-standard names) testdata< -data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata) <- c("ab", "cd", "ef", "gh", "ij") testdata2 <- data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata2) <- c("ab", "cd", "ef", "gh", "ij") # works showplot1(indata=testdata, inx=2, iny=3) # this update works in the aes_q version showplot1(indata=testdata, inx=2, iny=3) %+% testdata2 

Nota: A partire da ggplot2 v2.0.0 aes_q() è stato sostituito con aes_() per essere coerenti con le versioni SE delle funzioni NSE in altri pacchetti.

Il tuo problema è che aes non conosce l’ambiente della tua funzione e guarda solo all’interno global environment . Quindi, la variabile dat dichiarata all’interno della funzione non è visibile alla funzione aes di ggplot2 meno che non la passi esplicitamente come:

 showplot1< -function(indata, inx, iny) { dat <- indata p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]), environment = environment()) p <- p + geom_point(size=4, alpha = 0.5) print(p) } 

Notare l'argomento environment = environment() all'interno del comando ggplot() . Dovrebbe funzionare ora.

Provare:

 showplot1 < - function(indata, inx, iny) { x <- names(indata)[inx] y <- names(indata)[iny] p <- ggplot(indata, aes_string(x = x, y = y)) p + geom_point(size=4, alpha = 0.5) } 

Modificato per mostrare cosa sta succedendo - aes_string usa gli argomenti citati, i nomi li usano usando i tuoi numeri.

soluzione provvisoria ho trovato per il momento:

 showplot1< -function(indata, inx, iny){ dat<-data.frame(myX=indata[,inx], myY=indata[,iny]) print(nrow(dat)); # this is just to show that object 'dat' is defined p <- ggplot(dat, aes(x=myX, y=myY)) p + geom_point(size=4, alpha = 0.5) } 

Ma non mi piace molto perché nel mio codice reale ho bisogno di altre colonne da indata e qui dovrò definirle tutte esplicitamente in dat< - ...