Abordar x e y en aes por número de variable

Necesito dibujar un diagtwig de dispersión con las variables de direccionamiento por sus números de columna en lugar de nombres, es decir, en lugar de ggplot(dat, aes(x=Var1, y=Var2)) Necesito algo como ggplot(dat, aes(x=dat[,1], y=dat[,2])) . (Digo ‘algo’ porque este último no funciona).

Aquí está mi código:

 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 

Sugiero usar aes_q lugar de pasar vectores a aes (respuesta de @ Arun). Puede parecer un poco más complicado, pero es más flexible, por ejemplo, al actualizar los datos.

 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) } 

Y esta es la razón por la cual es preferible:

 # 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 partir de ggplot2 v2.0.0 aes_q() se ha reemplazado por aes_() para que sea coherente con las versiones SE de las funciones de NSE en otros paquetes.

Su problema es que aes no conoce el entorno de su función y solo se ve dentro global environment . Entonces, la variable dat declarada dentro de la función no es visible para la función aes ggplot2 a menos que la pase explícitamente como sigue :

 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) } 

Tenga en cuenta el argumento environment = environment() dentro del ggplot() . Debería funcionar ahora.

Tratar:

 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) } 

Editado para mostrar lo que está sucediendo - aes_string usa argumentos entrecomillados, los nombres los obtiene usando tus números.

solución provisional que encontré por el 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) } 

Pero realmente no me gusta porque en mi código real, necesito otras columnas de indata y aquí tendré que definirlas todas explícitamente en dat< - ...