在包装器中将参数传递给ggplot

Nic*_*ton 12 r function ggplot2

我需要将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)
}
Run Code Online (Sandbox Code Playgroud)

虚拟数据:

##Demo Data
myData <- data.frame(x=0,y=0,c="Color Series")
Run Code Online (Sandbox Code Playgroud)

现有的使用没有麻烦执行:

##Example of Original Function Usage, which executes as expected
plot <- ggplot(data=myData,aes(x=x,y=y,color=c)) + geom_point()
print(plot)
Run Code Online (Sandbox Code Playgroud)

目标用法语法:

##Example of Intended Usage, which Throws Error ----- "object 'xcol' not found"
mywrapper(data=myData,xcol=x,ycol=y,colorVar=c)
Run Code Online (Sandbox Code Playgroud)

上面给出了ggplot2包的"原始"用法示例,以及我如何将其包装在另一个函数中.但是,包装器会抛出错误.

我确信这适用于许多其他应用程序,它可能已被回答了一千次,但是,我不确定这个主题在R中被称为"被称为".

Pau*_*tra 10

这里的问题是ggplot 在数据对象中查找column命名xcol.我建议切换到使用aes_string并传递要使用字符串映射的列名,例如:

mywrapper(data = myData, xcol = "x", ycol = "y", colorVar = "c")
Run Code Online (Sandbox Code Playgroud)

并相应地修改您的包装:

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)
}
Run Code Online (Sandbox Code Playgroud)

一些评论:

  1. 个人偏好,我使用了很多空间,例如x = 1,对我来说,这大大提高了可读性.没有空格,代码看起来像一个大块.
  2. 如果将绘图返回到函数外部,我不会在函数内部打印,而是在函数外部打印.