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. 関数の 2 行目で、次のような変数名を渡したいと思います。

    `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 に渡されるオブジェクトにベクトルが 1 つだけ存在することを想定していることに注意してください$(つまり、上記のコードではネストされたリストを使用できませんでした)。

于 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]

各変数をプロットするには、変数名とファイル名の 2 つの文字列セットを取得します。

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()
}

そうしないと、ばかげた "longley[[i]]" が y-label として与えられるため、var.name[i] を ylab として使用すると、冗長になります。

于 2012-03-12T23:10:57.990 に答える