我需要绘制一个散点图,用列号而不是名称来寻址变量,也就是说,我需要类似ggplot(dat, aes(x=dat[,1], y=dat[,2]))
的东西来代替ggplot(dat, aes(x=Var1, y=Var2))
。(我说'something'是因为后者不起作用)。
下面是我的代码:
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
8条答案
按热度按时间oewdyzsn1#
问题是
aes
不知道你的函数的环境,它只在global environment
中查找,所以,在函数中声明的变量dat
对于ggplot2
的aes
函数是 * 不可见的 , 除非你显式地 * 传递它:注意
ggplot()
命令中的参数environment = environment()
,它现在应该可以工作了。mccptt672#
我强烈建议使用
aes_q
而不是将向量传递给aes
(@Arun 's answer).它看起来可能有点复杂,但它更灵活,例如在更新数据时.以下是它更可取的原因:
**注意:*自 * ggplot 2 v2.0.0起,
aes_q()
已替换为aes_()
,以与其他软件包中SE函数的SE版本保持一致。nwnhqdif3#
试试看:
编辑以显示正在发生的事情- aes_string使用带引号的参数,names使用您的数字获取它们。
gdrx4gfi4#
使用
ggplot2 V3.0.0
中的新特性对@Shadow的答案进行了修改:ensym
从包含在变量中的字符串创建一个符号(所以我们首先必须在函数的开头创建这些变量),然后!!
将其取消引号,这意味着它将像您已经为函数提供了原始名称一样工作。!!
只在设计为支持它的函数的上下文中工作,通常是tidyverse函数,否则它只表示“not not”(类似于as.logical
)。hc8w905p5#
出于完整性考虑,我认为使用列名而不是索引更安全,因为数据框中的列位置可以更改,从而导致意外结果。
下面的
plot_duo
函数(取自this answer)可以将输入用作字符串或空列名使用
purrr::map()
跨列应用plot_duo
函数由reprex package(版本0.2.1.9000)于2019年2月18日创建
qyyhg6bp6#
aes_()
和aes_quote()
方法现在已软弃用。一种与准引号一致的简单方法是通过.data[[col_name]]
调用列名。您可以轻松地根据位置提取列名。例如:由reprex package(v2.0.0)于2021年9月22日创建
zzzyeukh7#
作为@moodymudskipper答案的补充,如果您想在
magrittr
管道中使用它,可以使用此外,如果只想在特定图层中使用
aes
,则可以使用当然,如果需要,可以将其 Package 成函数:
尽管这会失去使用管道的意义
u7up0aaq8#
我暂时找到了一个临时解决方案:
但我并不喜欢它,因为在我的实际代码中,我需要
indata
中的其他列,在这里我必须在dat<-
中显式定义所有列...