33

名前の代わりに列番号で変数をアドレス指定して散布図を描く必要がggplot(dat, aes(x=Var1, y=Var2))ありますggplot(dat, aes(x=dat[,1], y=dat[,2]))。(後者は機能しないため、「何か」と言います)。

これが私のコードです:

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
4

7 に答える 7

24

あなたの問題は、aesあなたの関数の環境を知らず、それは内にしか見えないということglobal environmentです。したがって、dat関数内で宣言された変数は、明示的に次のように渡さない限り、の関数には表示されません。ggplot2aes

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

environment = environment()コマンド内の引数に注意してくださいggplot()。これで動作するはずです。

于 2013-03-10T14:53:49.457 に答える
15

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

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 は、他のパッケージの NSE 関数の SE バージョンと一致するようにaes_q()置き換えられました。aes_()

于 2015-06-03T11:27:24.407 に答える
13

試す:

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 は引用符で囲まれた引数を使用し、名前は番号を使用してそれらを取得します。

于 2013-03-10T14:43:05.733 に答える
8

からの新機能を使用した@Shadowの回答のバリエーションggplot2 V3.0.0

showplot <- function(indata, inx, iny){
  nms <- names(indata)
  x <- nms[inx]
  y <- nms[iny]
  p <- ggplot(indata, aes(x = !!ensym(x), y = !!ensym(y)))
  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))
names(testdata) <- c("a-b", "c-d", "e-f", "g-h", "i-j")
showplot(indata=testdata, inx=2, iny=3)

ensym変数に含まれる文字列からシンボルを作成し (そのため、最初に関数の開始時にこれらの変数を作成する必要があります)、!!引用符を外します。これは、関数に生の名前を与えたかのように機能することを意味します。

!!それをサポートするように設計された関数、通常は tidyverse 関数のコンテキストでのみ機能しas.logicalます。

于 2018-11-06T09:57:07.313 に答える
0

今のところ見つけた暫定的な解決策:

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

indataしかし、実際のコードでは他の列が必要であり、ここでそれらすべてを明示的に定義する必要があるため、あまり好きではありませんdat<-...

于 2013-03-10T14:44:32.420 に答える