Передача аргументов 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
, для меня это значительно улучшает читаемость. Без пробелов код выглядит как большой блок.
- Если вы вернете график вне функции, я бы не печатал его внутри функции, а просто вне функции.