Передать имя переменной в название функции построения - PullRequest
9 голосов
/ 12 марта 2012

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

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

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

    , чтобы мне не нужно было ставить«Кровь» в поле «Заголовок» функции (например, Dplotter (mydata $ id, mydata $ blood)

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

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

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

Ответы [ 2 ]

13 голосов
/ 12 марта 2012

Общий ответ 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")

, который производит:

imagedeparse(substitute()) 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 не является вектором, что в объекте, переданном в plot, всегда будет только один $ (т. е. вы не можете использовать вложенный список, например, с приведенным выше кодом).

1 голос
/ 13 марта 2012

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

Я буду использовать набор данных longley для иллюстрации уловки.

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

...