2012-03-12 7 views
9

Мне было интересно, может ли кто-нибудь помочь мне использовать имя переменной внутри функции. Я собрал точку, которая сортирует переменные, а затем создает растровое изображение, но я не могу получить R, чтобы передать имя переменной в заголовок plot.Передать имя переменной в заголовок функции title

Пример данных

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. Во второй строке функции, я хотел бы передать переменную имя, что-то вроде

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

    , так что я не» t нужно поставить «Кровь» в поле «Название поля» (например, Dplotter (mydata $ id, mydata $ blood)

    В принципе, как вставить имя переменной в функцию? Это было бы лучше, если бы можно было вытащить имя набора данных из заголовка (без прикрепления набора данных, о котором мне сказали, это плохо практика), так что вместо получения mydata$blood вы получите «кровь», в названии.

    Я не нашел легкое решение для вставки имени переменной в функции. Как вы можете догадаться, поместить имя переменной в paste() функция возвращает значения переменной (так что заголовок сюжета заполняется значениями, а не именем переменной).

  2. Я хотел бы также автоматизировать функцию еще дальше, так что я могу просто поставить набор данных и идентификатор, а затем функцию повторяют для каждой переменной в наборе данных. Очевидно, для этого необходимо сначала решить вопрос , в противном случае как заголовок, так и имена файлов будут встречаться с проблемами .

ответ

13

Общий ответ deparse(substitute(x)). Например.

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

Здесь используется:

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

Который производит:

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

В вашем конкретном примере, хотя, это не будет работать, потому что вы не хотите dat$x как название, вы хотите просто x. Мы могли бы сделать немного больше манипуляций, однако:

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

Что для fooPlot(dat$x, col = "red") дает:

second attempt

Примечание Этот код делает некоторые предположения, что main не является вектором, что будет только когда-либо один $ в объекте, переданном в сюжет (т. е. вы не могли использовать вложенный список, например, с указанным выше кодом).

+0

спасибо. Он работает очень хорошо. Есть ли у кого-нибудь предложения о том, как сделать 2 (вопрос 2, см. Выше). Например, запустите foo plot run в рамках другой функции «PlotALL», которая передает все переменные набора данных один за другим для построения foo? Это позволило бы мне написать ## PlotAll (id, mydata) и распечатать все графики. Большое спасибо –

1

Вам нужно получить набор строк, имена переменных и использовать их для названия ваших участков и имен файлов.

Я буду использовать длинный набор данных, чтобы проиллюстрировать трюк.

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] 

Для построения каждого переменный, получает два набора строк: имена переменных и имен файлов:

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 = "", так как в противном случае это дает глупое "Лонкло [[я]]", как y-label, и если я использую var.name [i] как ylab, это будет излишним.

+0

Дорогой p_barill, это именно то, что мне нужно. Большое вам спасибо за вашу помощь. –

Смежные вопросы