为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2019-12-27 15:38:19
我需要绘制一个散点图,用变量的列号而不是名称来寻址变量,即代替,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
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

@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)。


查看完整回答
反对 回复 2019-12-27
?
FFIVE

TA贡献1797条经验 获得超6个赞

您的问题是,aes您不知道函数的环境,而只看内部global environment。因此,变量dat声明中的功能是不可见到ggplot2的aes功能,除非你明确地传递为:


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()命令。现在应该可以工作了。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 662 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信