2013-03-10 5 views
23

アドレッシング変数を名前の代わりに列番号で描画する必要があります。つまり、ggplot(dat, aes(x=Var1, y=Var2))の代わりにggplot(dat, aes(x=dat[,1], y=dat[,2]))のようなものが必要です。 (後者は機能しないので、私は「何か」と言う)。変数番号によるxとyのアドレッシング

は、ここに私のコードです:

showplot1<-function(indata, inx, iny){ 
    dat<-indata 
    print(nrow(dat)); # this is just to show that object 'dat' is defined 
    p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny])) 
    p + geom_point(size=4, alpha = 0.5) 
} 

testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) 
showplot1(indata=testdata, inx=2, iny=3) 
# Error in eval(expr, envir, enclos) : object 'dat' not found 

答えて

13

ベクトルをaes(@ Arunの答え)にするのではなく、を使用することを強くお勧めします。もう少し複雑に見えるかもしれませんが、柔軟性があります。データを更新する。

showplot1 <- function(indata, inx, iny){ 
    p <- ggplot(indata, 
       aes_q(x = as.name(names(indata)[inx]), 
        y = as.name(names(indata)[iny]))) 
    p + geom_point(size=4, alpha = 0.5) 
} 

そして、ここではそれが好ましい理由です:

# test data (using non-standard names) 
testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) 
names(testdata) <- c("a-b", "c-d", "e-f", "g-h", "i-j") 
testdata2 <- data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) 
names(testdata2) <- c("a-b", "c-d", "e-f", "g-h", "i-j") 

# works 
showplot1(indata=testdata, inx=2, iny=3) 
# this update works in the aes_q version 
showplot1(indata=testdata, inx=2, iny=3) %+% testdata2 

注:ggplot2 v2.0.0デベロッパーのようaes_q()はSEのバージョンと一致するようにaes_()に置き換えられました他のパッケージのNSE機能

+0

確かに、あなたのソリューションはより柔軟に見える、私は正しい軸のタイトルを作ることも好きです...ありがとう! –

+5

ggplot2 v2.0.0から:aes_q()はaes_()に置き換えられ、他のパッケージのNSE関数のSEバージョンと一致します。https://github.com/hadley/ggplot2/blob/master/NEWS.md#非難された機能 – Tung

12

試してみてください。

showplot1 <- function(indata, inx, iny) { 
    x <- names(indata)[inx] 
    y <- names(indata)[iny] 
    p <- ggplot(indata, aes_string(x = x, y = y)) 
    p + geom_point(size=4, alpha = 0.5) 
} 

編集が起こっているのかを示すために - aes_string用途は、引数を引用し、名前はあなたの番号を使用してそれらを取得します。私は一瞬見つかり

+0

申し訳ありません@alexwhan、それは私にとって非常に明確ではありません - もう少し説明できますか?ありがとう! –

+0

最初のバージョンでは実際にあなたの質問に答えられませんでした。 – alexwhan

+0

はい、これは完全に機能します。君たちありがとう! –

0

暫定ソリューション:私の実際のコードでは、私はindataから、他の列を必要とし、ここで私は明示的にそれらのすべてを定義する必要がありますので

showplot1<-function(indata, inx, iny){ 
    dat<-data.frame(myX=indata[,inx], myY=indata[,iny]) 
    print(nrow(dat)); # this is just to show that object 'dat' is defined 
    p <- ggplot(dat, aes(x=myX, y=myY)) 
    p + geom_point(size=4, alpha = 0.5) 
} 

しかし、私は本当に好きではありませんdat<- ...

20

aesは、お使いの機能の環境を認識しておらず、global environmentの中にしか表示されません。

showplot1<-function(indata, inx, iny) { 
    dat <- indata 
    p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]), environment = environment()) 
    p <- p + geom_point(size=4, alpha = 0.5) 
    print(p) 
} 

ggplot()コマンド内の引数environment = environment():あなたのように明示的それを渡さない限りので、関数内で宣言された変数dat見えないggplot2aes機能です。今はうまくいくはずです。

+0

はい、私はそれが範囲の問題であると疑っていましたが、今は明らかです。私はこのソリューションがさらに好きです。ありがとう! –

関連する問題