Tenho uma função personalizada que chama ggplot. Gostaria de tornar um dos argumentos ggplot opcional - por exemplo, alterando a cor de geom_point. Conheço duas maneiras de fazer isso, conforme mostrado abaixo; uma é especificar um padrão se o argumento opcional não for fornecido, e a outra é envolver toda a função ggplot (aqui, geom_point()
) em uma instrução if. Nenhuma delas é ideal no meu caso - o argumento que estou usando não tem um padrão fácil, e a própria função ggplot já está em uma instrução if/else if/else no meu código, o que significa que eu acabaria com muitas instruções if aninhadas. Existe alguma maneira de passar um argumento dizendo essencialmente, "ignore este argumento, use seu comportamento padrão"?
Aqui está um exemplo muito básico das duas maneiras que funcionam:
library(ggplot2)
library(dplyr)
# Opt 1 - specify a default; not viable in my actual problem due to lack of default
fun_default <- function(df, x, y, color="red"){
p <- df %>%
ggplot(aes({{x}}, {{y}})) +
geom_point(color=color)
p
}
# Opt 2 - use an if statement for the whole argument
# workable but cumbersome in my actual problem, since I'd have to repeat the if/else multiple times throughout the code
fun_if <- function(df, x, y, color=NULL){
p <- df %>%
ggplot(aes({{x}}, {{y}})) +
{if(is.null(color)) { geom_point() }
else { geom_point(color = color)}}
p
}
fun_default(mtcars, wt, mpg, color="blue")
fun_if(mtcars, wt, mpg, color="blue")
fun_if(mtcars, wt, mpg)
O que eu gostaria de fazer é aninhar uma declaração if dentro da chamada geom_point, ou definir um argumento de cor que seria o padrão do ggplot, sem especificar o padrão por conta própria. Na minha cabeça, isso seria algo como um dos seguintes (obviamente, nenhum desses realmente funciona):
# if statement inside of geom_point()
fun_wish1 <- function(df, x, y, color=NULL){
p <- df %>%
ggplot(aes({{x}}, {{y}})) +
geom_point( {if(!is.null(color)) {color=color}} )
p
}
# somehow tell geom_point to ignore color or use its default for color
fun_wish2 <- function(df, x, y, color=NULL){
if(is.null(color)) {color = NA}
p <- df %>%
ggplot(aes({{x}}, {{y}})) +
geom_point(color=color)
p
}
Considere a construção de reticências para passar um número variável de argumentos:
1) Defina a transparência alfa como 0 se a cor estiver faltando, caso você queira evitar mostrar
geom_point
se a cor está faltando.2) Se
fun_if
você está preocupado em ter umif
no pipeline do ggplot geom, então eleif
pode estar fora dele.Na verdade, poderia até estar em uma função separada: