3 回答
TA贡献1772条经验 获得超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)。
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()命令。现在应该可以工作了。
- 3 回答
- 0 关注
- 724 浏览
添加回答
举报