2012-03-12 11 views
9

誰かが関数内で変数名を使用するのを助けることができるのだろうかと思っていました。 変数をソートしてビットマップを作成するドットプロットをまとめましたが、Rに変数名をplotというタイトルに渡すことができません。プロット関数名に変数名を渡すタイトル

例データ

機能の2行目に
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を解決する必要があります。そうでなければ、タイトルとファイル名の両方に の問題が発生します。

答えて

13

一般的な回答はdeparse(substitute(x))です。例えば。

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をしたくないので、これは動作しません。ここ

fooPlot <- function(x, main, ...) { 
    if(missing(main)) 
     main <- deparse(substitute(x)) 
    plot(x, main = main, ...) 
} 

は、それが使用されていますタイトルとしては、ちょうどxがほしいと思う。私たちは、しかし、もう少し操作を行うことができ:

second attempt

注意をこのコードがしかがあることを、mainがベクトルではないことを、いくつかの仮定を行いますfooPlot(dat$x, col = "red")のために与え

fooPlot <- function(x, main, ...) { 
    if(missing(main)) { 
     main <- deparse(substitute(x)) 
     if(grepl("\\$", main)) { 
      main <- strsplit(main, "\\$")[[1]][2] 
     } 
    } 
    plot(x, main = main, ...) 
} 

を1つの$がplotに渡されます(つまり、上記のコードでネストされたリストを使用できませんでした)。

+0

ありがとうございました。それは本当にうまくいく。 誰でも2(質問2、上記参照)を行う方法に関する提案はありますか?たとえば、fooプロットを、データセットのすべての変数を1つずつ通過させてfooプロットにする別の関数 "PlotALL"内で実行しますか? ## PlotAll(id、mydata) と書くことができ、すべてのグラフが印刷されます。 多くのお礼ありがとうございます。 –

1

文字列のセット、変数名を取得し、それらをプロットやファイル名のタイトルとして使用する必要があります。

私は、このトリックを説明するためにlongleyデータセットを使用します。 longley [[i]は] "のように "そう、それは愚かなを与えることから、"

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 =":変数名とファイル名:

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] 

は、文字列の2セットを取得し、各変数をプロットするにはy-ラベルとし、ylabとしてvar.name [i]を使用すると、重複してしまいます。

+0

親愛なるp_barillさん、私が必要としていたものです。手伝ってくれてどうもありがとう。 –