我想知道是否有人可以帮我在函数中使用变量名。
我已经整理了一个点图,对点变量进行排序,然后生成一个位图,但我无法让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")
在函数的第二行,我想传递变量 名字,比如
`if (is.null(Title)) {Title=varname(x)} else {Title=Title}`
这样我就不必放血了#34; Blood&#34;在功能标题字段中 (例如Dplotter(mydata $ id,mydata $ blood)
基本上,如何在函数中粘贴变量名?它
如果可以从中取出数据集名称会更好
标题(没有附加数据集,我被告知是坏的
练习),以便获得mydata$blood
,而不是获得paste()
&#34;血液&#34;在标题中。
我找不到粘贴变量名称的简单解决方案 一个功能。你可以猜到,把变量名放在一个 {{1}}函数返回变量的值(以便 情节标题用值而不是变量名称填充。
我还想进一步自动化这个功能,这样我就可以 只需放入数据集和ID,然后重复该功能 对于数据集中的每个变量。显然这需要解决 问题1首先,否则标题和文件名都会遇到 问题。
答案 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")
产生:
在您的特定示例中,这不起作用,因为您不希望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的对象中只有一个$
(即你不能使用嵌套列表上面代码的例子。)
答案 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,那将是多余的。