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

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. 在该函数的第二行,我想传递变量名,类似于

    ```python def some_function(variable_name): ```
`if (is.null(Title)) {Title=varname(x)} else {Title=Title}`

我希望在函数标题中不必输入"Blood" (例如Dplotter(mydata$id,mydata$blood))。基本上,如何在函数中插入变量名?最好能够从标题中删除数据集名称(不需要附加数据集,这是不好的实践),因此您只需获得"blood"而不是mydata$blood

我无法找到在函数中轻松插入变量名的解决方案。像你猜测的那样,在paste()函数中放置变量名会返回变量的值(因此图表标题将填充值而不是变量名)。

此外,我还想进一步自动化该函数,以便我只需放入数据集和ID,然后对数据集中的每个变量重复运行该函数。显然,这需要先解决问题1,否则标题和文件名都会遇到问题。

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"),得到如下结果:

second attempt

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


非常感谢。它运行得非常好。 有人对如何完成第二个问题(见上文)有什么建议吗?例如,将foo plot运行在另一个函数“PlotALL”中,该函数逐个传递数据集的所有变量到foo plot中?这将使我能够编写

PlotAll (id,mydata)

并打印出所有图形。非常感谢。
- Marco M

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轴标签,如果我使用var.name[i]作为ylab,那就是多余的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接