我有以下简单的功能,但它的ggplot命令不起作用。从命令行给出命令时,该命令可以正常工作:
> testfn <- function(gdf, first, second){
library(ggplot2)
print(ggplot(gdf, aes(first, second)) + geom_point())
}
>
> testfn(mydataf, vnum1, vnum2)
Error in eval(expr, envir, enclos) : object 'second' not found
>
> ggplot(mydataf, aes(vnum1, vnum2)) + geom_point()
> (plots graph without any error)
我尝试使用aes_string
代替aes
;并使用x=first, y=second
。事情有所改善,有一点被绘制出来! X和Y轴显示与该点相关的数字作为标签。仅绘制第一行。问题出在哪儿。谢谢你的帮助。
答案 0 :(得分:4)
(根据我的初步建议和您的确认)
这是关于你如何尝试将变量名的字符串参数传递给你的fn。
ggplot(gdf, aes(first, second))
可以正常工作aes_string(first,second)
,因为你现在通过字符串变量第一,第二次间接传递变量名。first,second
是字符串,是的,你需要在调用fn时引用它们。 (我不确定ggplot&#39; s aes()
使用什么语言机制来不需要字符串,但无论如何。使用引号。)quote()
命令
答案 1 :(得分:3)
所以aes_string
版本对我来说很好。
# set-up and sample data
library(ggplot2)
set.seed(1)
mydataf <- data.frame(vnum1=rnorm(10),
vnum2=rnorm(10))
# aes_string version called with characters
testfn <- function(gdf, first, second){
print(ggplot(gdf, aes_string(x=first, y=second)) + geom_point())
}
# aes_string version called with variables
testfn2 <- function(gdf, first, second){
print(ggplot(gdf, aes_string(x=deparse(substitute(first)),
y=deparse(substitute(second)))) +
geom_point())
}
# 3 times the same plot
ggplot(mydataf, aes(vnum1, vnum2)) + geom_point()
testfn(mydataf, "vnum1", "vnum2")
testfn2(mydataf, vnum1, vnum2)