Como tratar em r: objeto do tipo “fechamento” não é subdefinível


Um erro que você pode encontrar no R é:

 object of type 'closure' is not subsettable

Este erro ocorre quando você tenta criar um subconjunto de uma função.

Em R é possível criar subconjuntos de listas, vetores, matrizes e quadros de dados, mas uma função tem o tipo “fechamento” que não pode ser subconjunto.

Este tutorial explica exatamente como resolver esse erro.

Como reproduzir o erro

Suponha que criemos a seguinte função em R que pega cada valor de um vetor e o multiplica por 5:

 #define function
cool_function <- function (x) {
  x <- x*5
  return (x)
}

Veja como poderíamos usar essa função na prática:

 #define data
data <- c(2, 3, 3, 4, 5, 5, 6, 9)

#apply function to data
cool_function(data)

[1] 10 15 15 20 25 25 30 45

Observe que cada valor do vetor original foi multiplicado por 5.

Agora suponha que tentamos subconjunto da função:

 #attempt to get first element of function
cool_function[1]

Error in cool_function[1]: object of type 'closure' is not subsettable

Recebemos um erro porque não é possível criar um subconjunto de um objeto do tipo “fechamento” em R.

Podemos usar a seguinte sintaxe para verificar se a função é de fato do tipo ‘fechamento’:

 #print object type of function
typeof(cool_function)

[1] “closure”

Mais exemplos de objetos “Closure”

Toda função em R é do tipo “fechamento”. Por exemplo, receberíamos este erro se tentássemos subconjunto de qualquer função na base R:

 #attempt to subset mean function
mean[1]

Error in mean[1]: object of type 'closure' is not subsettable

#attempt to subset standard deviation function
sd[1]

Error in sd[1]: object of type 'closure' is not subsettable

#attempt to subset table function
tabld[1]

Error in table[1]: object of type 'closure' is not subsettable

Como resolver o erro

A maneira de resolver esse erro é simplesmente evitar a subdefinição de uma função.

Por exemplo, se quisermos aplicar nossa cool_function anterior apenas ao primeiro elemento de um vetor, podemos usar a seguinte sintaxe:

 #apply function to just first element in vector
cool_function(data[1])

[1] 10

Não obtemos um erro porque subdefinimos o vetor em vez da função.

Ou poderíamos aplicar cool_function a todo o vetor:

 #apply function to every element in vector
cool_function(data)

[1] 10 15 15 20 25 25 30 45

Não estamos recebendo um erro porque não tentamos criar subconjuntos da função de forma alguma.

Recursos adicionais

Os tutoriais a seguir explicam como resolver outros erros comuns em R:

Como corrigir: a condição tem comprimento > 1 e apenas o primeiro elemento será usado
Como corrigir em R: dim(X) deve ter comprimento positivo
Como corrigir em R: valor ausente onde verdadeiro/falso é necessário
Como corrigir: NAs introduzidos por coerção

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *