2012-03-12 89 views
9

我想知道是否有人可以帮助我在函数中使用变量名称。 我已经放在一起,对变量进行排序然后产生一个位图的点图,但我不能让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}` 
    

    使得我不t必须在功能标题字段 (例如Dplotter(mydata $ id,mydata $ blood)

    基本上,如何在函数中粘贴变量名?如果可以从 标题中取出数据集名称(没有附加数据集,我已经告诉其实的做法不好),那么 会更好,因此您可以取而代之以获得mydata$blood,这样就可以得到 “鲜血”在标题中。

    我找不到一个简单的解决方法,在 函数中粘贴变量名。如您所知,将变量名称放入一个 paste()函数将返回变量的值(以便 绘图标题填充值而不是变量名称)。

  2. 我还想更进一步自动化功能,这样我可以 只是把数据集和ID,然后有功能重复 在数据集中的每个变量。显然这需要先解决 问题1,否则标题和文件名都会遇到 问题。

回答

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不是一个载体,将有永远只能是一个$在传递给plot的对象中(也就是说,例如上面的代码不能使用嵌套列表)。

+0

非常感谢。它工作得很好。 有没有人对如何做2有任何建议(问题2,见上文)。例如,让foo绘图在另一个函数“PlotALL”中运行,该函数将数据集的所有变量逐一传递给foo plot? 这将允许我写 ## PlotAll(id,mydata) 并获得所有打印的图形。 非常感谢 – 2012-03-12 12:29:20

1

您需要检索一组字符串和变量名称,并将它们用于绘图和文件名的标题。

我将使用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 = “”,否则它给出了一个愚蠢的 “朗利[我]” 作为y标签,如果我使用var.name [i]作为ylab,它将是多余的。

+0

亲爱的p_barill,这正是我需要的。非常感谢你的帮助。 – 2012-03-13 14:54:20