将变量名称传递给绘图函数标题

时间:2012-03-12 11:24:07

标签: r function variable-names

我想知道是否有人可以帮我在函数中使用变量名。 我已经整理了一个点图,对点变量进行排序,然后生成一个位图,但我无法让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}`
    

    这样我就不必放血了#34; Blood&#34;在功能标题字段中 (例如Dplotter(mydata $ id,mydata $ blood)

    基本上,如何在函数中粘贴变量名?它 如果可以从中取出数据集名称会更好 标题(没有附加数据集,我被告知是坏的 练习),以便获得mydata$blood,而不是获得paste() &#34;血液&#34;在标题中。

    我找不到粘贴变量名称的简单解决方案 一个功能。你可以猜到,把变量名放在一个 {{1}}函数返回变量的值(以便 情节标题用值而不是变量名称填充。

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

2 个答案:

答案 0 :(得分:13)

一般答案是deparse(substitute(x))。 E.g。

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的对象中只有一个$(即你不能使用嵌套列表上面代码的例子。)

答案 1 :(得分: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 =“”,否则它给出了一个愚蠢的“longley [[i]]”作为y-label,如果我使用var.name [i]作为ylab,那将是多余的。