Я пытаюсь создать функцию, которая может принимать либо одну группу, либо несколько групп, используя один аргумент colour
. Однако, похоже, есть проблема с указанием colour
как глобально (в aes()
), так и локально (в geom_smooth()
). Похоже, aes()
не принимает colour=NULL
или просто оставил пустым colour=
.
Сюжет без групп (работает)
scatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,what.Colour="purple") {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response)) +
geom_smooth(method="lm",colour=what.Colour)
}
scatterfunction()
Сюжет с группами (работает)
groupscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),what.Colour=c("purple", "yellow", "brown")) {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour=Group.variable)) +
geom_smooth(method="lm") +
scale_color_manual(values=what.Colour)
}
groupscatterfunction()
График без групп, условный (работает при has.Groups=F
)
conditionalscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),has.Groups=F,what.Colour="purple") {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour= if(has.Groups==T) {Group.variable})) +
geom_smooth(method="lm",colour= if(has.Groups==F){what.Colour}) +
if (has.Groups==T) {scale_color_manual(values=what.Colour)}
}
conditionalscatterfunction()
График с группами, условный (не работает, когда has.Groups=T
)
conditionalscatterfunction(Data = mtcars,
Predictor = mtcars$wt,
Response = mtcars$mpg,
has.Groups = TRUE,
Group.variable = factor(mtcars$cyl),
what.Colour = c("purple", "yellow", "brown"))
Error: Aesthetics must be either length 1 or the same as the data (80): colour
Использование альтернативного оператора switch()
работало у меня раньше, но не здесь:
conditionalscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),has.Groups=T,what.Colour=c("purple", "yellow", "brown")) {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour= switch(has.Groups, Group.variable))) +
geom_smooth(method="lm",colour= if(has.Groups==F){what.Colour}) +
if (has.Groups==T) {scale_color_manual(values=what.Colour)}
}
conditionalscatterfunction()
Error: Aesthetics must be either length 1 or the same as the data (80): colour
Кажется, что пока я добавляю оператор «colour=
» в aesthetics()
, независимо от того, оставлю ли я его пустым или = NULL
, я получаю эту ошибку. Каково его значение по умолчанию, если оно не вызывается явно?
Я бы предпочел не повторять весь вызов снова, потому что у меня также есть эта проблема с geom_points()
, geom_shape()
и т. д., и мне нужно будет повторить ее для каждой комбинации элементов...
Вопрос. Как решить эту проблему?
colour = NA
вместоcolour = NULL
? - person aosmith   schedule 10.09.2019aes(colour=NA)
, но не при включении в операторswitch()
илиifelse()
... Может быть,aes()
просто не может принимать операторыswitch()
илиifelse()
вообще? - person RemPsyc   schedule 10.09.2019dplyr
, а затем добавите еще один столбецcolor
, используя условия if-else. Затем вы сможете сослаться на столбецcolor
вggplot2
. - person yusuzech   schedule 10.09.2019ifelse(has.Groups==T,(mtcars$colour.col = Group.variable),(mtcars$colour.col = what.Colour))
. Затем я поменял наaes(colour=mtcars$colour.col)
. Работает, если я удалю аргументcolour=
в geom_smooth, но не иначе... Правильно ли я сделал? - person RemPsyc   schedule 10.09.2019