Передача аргументов ggplot в оболочке

Мне нужно обернуть 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)
}

Dummy Data:

##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.

Ответ 1

Проблема здесь в том, что ggplot ищет в объекте данных column с именем 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)
}

Некоторые замечания:

  • Личные предпочтения, я использую много пространств вокруг, например. x = 1, для меня это значительно улучшает читаемость. Без пробелов код выглядит как большой блок.
  • Если вы вернете график вне функции, я бы не печатал его внутри функции, а просто вне функции.