我需要将ggplot2包装到另一个函数中,并且希望能够以接受它们的相同方式解析变量,有人可以指引我正确的方向。
让我们举例说,我们考虑下面的MWE。
#Load Required libraries.
library(ggplot2)
##My Wrapper Function.
mywrapper <- function(data,xcol,ycol,colorVar){
writeLines("This is my wrapper")
plot <- ggplot(data=data,aes(x=xcol,y=ycol,color=colorVar)) + geom_point()
print(plot)
return(plot)
}
虚拟数据:
##Demo Data
myData <- data.frame(x=0,y=0,c="Color Series")
现有的使用方式,无需麻烦执行:
##Example of Original Function Usage, which executes as expected
plot <- ggplot(data=myData,aes(x=x,y=y,color=c)) + geom_point()
print(plot)
目标用法语法:
##Example of Intended Usage, which Throws Error ----- "object 'xcol' not found"
mywrapper(data=myData,xcol=x,ycol=y,colorVar=c)
上面给出了ggplot2包的“原始”用法示例,以及我希望如何将其包装在另一个函数中。然而,包装器会抛出错误。
我确信这适用于许多其他应用程序,它可能已被回答了一千次,但是,我不确定这个主题在R中被称为“。”
答案 0 :(得分:10)
这里的问题是ggplot在数据对象中查找名为column
的{{1}}。我建议切换到使用xcol
并使用字符串传递要映射的列名,例如:
aes_string
相应地修改你的包装器:
mywrapper(data = myData, xcol = "x", ycol = "y", colorVar = "c")
一些评论:
mywrapper <- function(data, xcol, ycol, colorVar) {
writeLines("This is my wrapper")
plot <- ggplot(data = data, aes_string(x = xcol, y = ycol, color = colorVar)) + geom_point()
print(plot)
return(plot)
}
,对我而言,这极大地提高了可读性。没有空格,代码就像一个大块。答案 1 :(得分:1)
这只是原始答案的补充,我确实知道这是一篇很老的文章,但只是作为补充:
原始答案提供了以下代码来执行包装程序:
mywrapper(data = "myData", xcol = "x", ycol = "y", colorVar = "c")
在这里,data
作为字符串提供。据我所知,这将无法正确执行。仅aes_string
中的变量作为字符串提供,而data
对象则作为对象传递给包装器。