2012-03-12 11 views
9

Me preguntaba si alguien podría ayudarme a usar un nombre de variable dentro de una función. He creado un gráfico de puntos que ordena variables y luego produce un mapa de bits, pero no puedo obtener R para pasar el nombre de la variable al título plot.Pasar el nombre de la variable al título de la función de trazado

Datos de ejemplo

id<-c(1,2,3) 
blood<-c(1,2,10) 
weight<-c(1,2,13) 


mydata<-as.data.frame(cbind(id,blood,weight)) 
mydata$blood 

#######SORTED DOT PLOT#### 


Dplotter<-function (id,x,Title=""){ 
if (is.null(Title)) {Title=""} else {Title=Title} 

DIR<-paste("C:/temp/WholePlots/New/",Title,".bmp",sep="") 

D<-as.data.frame(cbind(id,x)) 
x1<-as.data.frame(D[order(x),]) 

bmp(DIR) 
dotchart(x1$x,labels=id,main=Title,pch=16) 
dev.off() 
} 


############### 
Dplotter(mydata$id,mydata$blood,"Blood") 

Dplotter(mydata$id,mydata$weight,"Weight") 
  1. En la segunda línea de la función, me gustaría transmitir la nombre de la variable, algo así como

    `if (is.null(Title)) {Title=varname(x)} else {Title=Title}` 
    

    modo que yo no' t tiene que poner "Sangre" en la función Título campo (por ejemplo, Dplotter (mydata $ id, mydata $ blood)

    Básicamente, ¿cómo se pega uno en el nombre de la variable en una función? Es sería aún mejor si uno puede sacar el nombre del conjunto de datos del título (sin adjuntar el conjunto de datos, que me han dicho es mala práctica ), de modo que en lugar de obtener mydata$blood, acaba de obtener "sangre" En el título.

    No he podido encontrar una solución fácil para pegar un nombre de variable en una función. Como puede adivinar, al poner el nombre de la variable en una función paste(), se devuelven los valores de la variable (de modo que el título del diagrama se rellena con los valores en lugar del nombre de la variable).

  2. También me gustaría para automatizar la función aún más, de modo que pueda sólo hay que poner el conjunto de datos y el ID y, a continuación, tienen la función repite para cada variable en el conjunto de datos. Obviamente, esto requiere resolver primero la pregunta 1 de , de lo contrario, tanto el título como los nombres de archivo encontrarán problemas en .

Respuesta

13

La respuesta general es deparse(substitute(x)). P.ej.

fooPlot <- function(x, main, ...) { 
    if(missing(main)) 
     main <- deparse(substitute(x)) 
    plot(x, main = main, ...) 
} 

aquí está en uso:

set.seed(42) 
dat <- data.frame(x = rnorm(1:10), y = rnorm(1:10)) 
fooPlot(dat, col = "red") 

que produce:

using <code>deparse(substitute())</code> to title a plot

En el ejemplo particular, sin embargo, esto no va a funcionar porque no desea dat$x como título, solo quiere x. Podríamos hacer un poco más la manipulación sin embargo:

fooPlot <- function(x, main, ...) { 
    if(missing(main)) { 
     main <- deparse(substitute(x)) 
     if(grepl("\\$", main)) { 
      main <- strsplit(main, "\\$")[[1]][2] 
     } 
    } 
    plot(x, main = main, ...) 
} 

Lo que para fooPlot(dat$x, col = "red") da:

second attempt

Nota este código hace algunos supuestos, que main no es un vector, que no siempre será solamente uno $ en el objeto pasado a la trama (es decir, no podría usar una lista anidada, por ejemplo, con el código anterior).

+0

Muchas gracias. Funciona realmente bien. ¿Alguien tiene alguna sugerencia sobre cómo hacer 2 (pregunta 2, ver arriba). Por ejemplo, hacer que foo plot se ejecute dentro de otra función "PlotALL", que pasa todas las variables de un conjunto de datos una por una para foo plot? Esto me permitiría escribir ## PlotAll (id, mydata) y obtener todos los gráficos impresos. Muchas gracias –

1

Necesita recuperar un conjunto de cadenas, los nombres de las variables y también usarlas para el título de sus tramas y nombres de archivo.

Voy a utilizar el conjunto de datos longley para ilustrar el truco.

data(longley, package="datasets") 

#return a vector with variable names 
colnames(longley) 
names(longley) #equivalent 

#get the name of a specific variable (column number): 
names(longley)[1] 

Para representar gráficamente cada variable, obtener dos juegos de cuerdas: los nombres de variables y nombres de archivo:

var.names=names(longley) 
file.names=paste(var.names, "bmp", sep=".") 
#with an extra step to prefix a directory to those filenames 

for (i in 1:ncol(longley)) { 

    bmp(file=file.names[i]) 
    plot(longley[[i]], main=var.names[i], ylab="") 
    dev.off() 
} 

ylab = "", ya que de lo contrario se da una tonta "Longley [[i]]", como y-label, y si utilizo var.name [i] como ylab, sería redundante.

+0

Estimado p_barill, eso es exactamente lo que necesitaba. Muchas gracias por tu ayuda. –

Cuestiones relacionadas