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