通过变量编号在AES中寻址x和y

我需要绘制一个散点图,用变量的列号而不是名称来寻址变量,即代替,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


MMTTMM
浏览 672回答 3
3回答

料青山看我应如是

@Shadow答案的一种变体,使用来自的新功能ggplot2 V3.0.0:showplot <- function(indata, inx, iny){&nbsp; nms <- names(indata)&nbsp; x <- nms[inx]&nbsp; y <- nms[iny]&nbsp; p <- ggplot(indata, aes(x = !!ensym(x), y = !!ensym(y)))&nbsp; p + geom_point(size=4, alpha = 0.5)}&nbsp; &nbsp;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)。

FFIVE

您的问题是,aes您不知道函数的环境,而只看内部global environment。因此,变量dat声明中的功能是不可见到ggplot2的aes功能,除非你明确地传递为:showplot1<-function(indata, inx, iny) {&nbsp; &nbsp; dat <- indata&nbsp; &nbsp; p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]), environment = environment())&nbsp; &nbsp; p <- p + geom_point(size=4, alpha = 0.5)&nbsp; &nbsp; print(p)}注意参数environment = environment()的内部ggplot()命令。现在应该可以工作了。
打开App,查看更多内容
随时随地看视频慕课网APP