Tenho uma função personalizada que recebe como entrada um quadro de dados e, em seguida, uma seleção de colunas desse quadro de dados, assim:
library(dplyr)
df <- data.frame(x = c(1, 2, 3, 4, 5), y = c(11, 12, 13, 14, 15))
sample_fun <- function(df, x, y) {
df <- df %>%
mutate(z = {{x}} * {{y}})
}
df_out <- sample_fun(df, x, y)
Gostaria de tornar uma das colunas do data frame opcional e, então, fazer a função testar sua presença usando !if.null()
. Se isso fosse um objeto, em vez de uma coluna do data frame, eu faria isso:
sample_fun <- function(df, x, y = NULL) {
if(!is.null(y)) {
df <- df %>%
mutate(z = {{x}} * y)
}
else(df <- df %>%
mutate(z = {{x}}))
}
df_out <- sample_fun(df, x)
df_out2 <- sample_fun(df, x, y)
No entanto, não consigo descobrir como verificar a presença da coluna de dados. Ambos if(!is.null(y))
e if(!is.null({{y}}))
retornam Error: object 'y' not found
. Qual é a melhor maneira de verificar a presença de y, quando y é uma coluna de data frame em vez de um objeto independente?
Uma opção é verificar se a
y
variável émissing
, em vez de usá-laNULL
como um espaço reservado.O problema com o código na questão é que
is.null
não é possível pegar uma variável sem aspas. O código ali funcionaria sequo_is_null(enquo(y))
fosse usado no lugar deis.null(y)
. Nesse caso, adicione alibrary(rlang)
também.Como alternativa, forneça
y
um valor padrão de 1.Você poderia generalizar isso um pouco.
Dados: