Argumentos das Funções

Bom dia!

Eu tenho percebido que os argumentos das funções podem ser usados de forma abreviada, no entanto, eu não sei bem os porquês disso acontecer. Eu vi algo no you tube a respeito dos argumentos de R serem preguiçosos (quando adiciono um argumento com uma função, porém, essa função não existindo no escopo, o R desconsidera o argumento).

Nesse sentido, se alguém puder explicar um pouco sobre o exemplo abaixo, onde a f() roda mesmo quando um dos argumentos tem seu nome abreviado com letras iniciais.

   f <- function(data, data_valor){
     data |> 
       dplyr::mutate(valor = data_valor)
     
   }
   
   # 1º argumento completo, 2º abreviado.
   # Roda o codigo
   df <- f(data = mtcars, d = 10)
   
   # 1º argumento abreviado, 2º completo.
   # Roda o codigo
   df <- f(d = mtcars, data_valor = 10)
   
   
   # 1º argumento abreviado, 2º argumento abreviado
   # Não roda o codigo
   
   df <- f(d = mtcars, d = 10)
#> Error in f(d = mtcars, d = 10): argumento formal "data" corresponde a múltiplos argumentos especificados

Created on 2022-06-04 by the reprex package (v2.0.1)

Para complementar na pergunta. Todos os exemplos abaixo retornam o mesmo resultado.

f <- function(data, qualquer_valor){

data |>
dplyr::mutate(valor = qualquer_valor)

}

f(data = mtcars, qualquer_valor = 10)

f(d = mtcars, q = 10)

f(mtcars, q = 10)

f(d = mtcars, 10)

f(mtcars, 10)

@Gerrio_Barbosa, esse comportamento do R se chama correspondência parcial (partial matching em inglês). Você pode usar esse recurso em vários lugares:

# Partial matching com $
lista <- list(elemento = 1)
lista$e
#> [1] 1

# Partial matching em argumentos
funcao <- function(argumento) {
  argumento
}
funcao(a = 1)
#> [1] 1

Created on 2022-06-05 by the reprex package (v2.0.1)

Você pode, inclusive, usar correspondência parcial em vários argumentos de uma mesma chamada de função desde que não haja ambiguidade. Como no R podemos chamar os argumentos em qualquer ordem (especificados os seus nomes), não pode haver ambiguidade acerca de a qual argumento estamos nos referindo:

# Função de exemplo
cola <- function(arg1, arg2) {
  cat(paste(arg1, arg2))
}

# Por padrão, os argumentos vêm na ordem
cola(1, 2)
#> 1 2

# Especificando os argumentos, podemos usar qualquer
# ordem
cola(arg1 = 1, arg2 = 2)
#> 1 2
cola(arg2 = 2, arg1 = 1)
#> 1 2

# Como um dos argumentos está especificado, podemos
# recorrer ao partial matching no outro
cola(a = 1, arg2 = 2)
#> 1 2
cola(arg1 = 1, a = 2)
#> 1 2

# Podemos até inverter a ordem dos argumentos, mas
# um deles sempre tem que estar especificado
cola(arg2 = 2, a = 1)
#> 1 2
cola(a = 2, arg1 = 1)
#> 1 2

# Mas aqui ocorre um problema. Estamos usando arg1
# ou arg2 primeiro? A função não consegue saber e
# ela não assume que eles estão em ordem porque você
# escolheu colocar os nomes deles.
cola(a = 1, a = 2)
#> Error in cola(a = 1, a = 2):
#>   formal argument "arg1" matched by multiple actual arguments

Created on 2022-06-05 by the reprex package (v2.0.1)

Se você quiser saber mais sobre o mecanismo pelo qual ocorre a correspondência parcial, basta olhar a função pmatch(). Dada uma série de abreviações e uma série de argumentos, ela retorna as correspondências:

# A correspondência é com o 2o valor
pmatch("e", c("argumento", "elemento"))
#> [1] 2

# Ambiguidade
pmatch("a", c("arg1", "arg2"))
#> [1] NA

Created on 2022-06-05 by the reprex package (v2.0.1)

P.S.: Nunca use correspondência parcial. Isso é um recurso antigo do R que ajuda a criar chamadas mais curtas, mas ele é altamente problemático. Por exemplo, se uma função for atualizada e ganhar um novo argumento, pode ser que o seu código antigo pare de funcionar! Isso sem falar na dificuldade adicional que você está criando para quem lê o seu código… Hoje em dia, com o RStudio, você pode simplesmente digitar a primeira letra de um argumento e apertar TAB para que a própria IDE complete o seu nome.

3 curtidas

Obg por complementar.

Show! Obg pelas explicações bastante esclarecedoras…