У меня есть фрейм данных:
test<-data.frame(F1=c(1,2,3,4,5),F2=c(3,4,5,6,7),Group=c("G1","G2","G2","G3","G1"))
Я пытаюсь настроить другой цвет точки в разных условиях:
FF<-function(Ture_or_not){
p<-ggplot(test,aes(x=F1,y=F2))+
geom_point(aes(color=Group),size=10)+
scale_color_manual(values=ifelse(Ture_or_not==TRUE,c("yellow","red","black"),c("black","black","black")))
p
}
FF(TRUE)
Но я получил:
Error: Insufficient values in manual scale. 3 needed but only 1 provided.
Run `rlang::last_error()` to see where the error occurred.
Могу я узнать, в чем проблема?
Одним из решений здесь было бы просто повторить значение Ture_or_not
по длине векторов названия цвета:
FF <- function(Ture_or_not) {
p <- ggplot(test, aes(x=F1, y=F2)) +
geom_point(aes(color=Group), size=10) +
scale_color_manual(values=ifelse(rep(Ture_or_not, 3),
c("yellow","red","black"),
c("black","black","black"))
)
return(p)
}
FF(TRUE)
Идея здесь заключается в том, что ifelse
нужен логический вектор одинаковой длины, чтобы решить, какое из трех векторных значений будет выбрано для каждой записи в этих векторах. Ваша текущая версия передает скалярное логическое значение, которое в результате просто возвращает одну запись (фактически первую) из любого из трех векторов цветов.
Согласен с комментарием @Lefkios Paikousis. Поскольку у вас есть скалярный вход, используйте скалярную функцию if
/else
вместо ifelse
.
library(ggplot2)
FF<-function(True_or_not){
ggplot(test,aes(x=F1,y=F2) )+
geom_point(aes(color=Group),size=10)+
scale_color_manual(values = if (True_or_not) c("yellow","red","black")
else c("black","black","black"))
}
FF(TRUE)
Я бы выбрал
if
вместоifelse
и сделал бы эту оценку до вызова ggplot.