10

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

    这样我就不必在函数标题字段中输入“Blood”(例如 Dplotter(mydata$id,mydata$blood)

    基本上,如何在函数中粘贴变量名?如果可以从标题中取出数据集名称会更好(不附加数据集,我被告知这是不好的做法),这样mydata$blood您就不会得到 ,而只是在标题中得到“血”。

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

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

4

2 回答 2

14

一般的答案是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")

产生:

使用 <code>deparse(substitute())</code> 为绘图命名

但是,在您的特定示例中,这不起作用,因为您不想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")给出:

第二次尝试

请注意,此代码做了一些假设,即main不是向量,传递给 plot 的对象中只会有一个$(例如,您不能在上面的代码中使用嵌套列表)。

于 2012-03-12T12:02:10.037 回答
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,那将是多余的。

于 2012-03-12T23:10:57.990 回答