Jak obsługiwać w r: obiekt typu „zamknięcie” nie jest subdefiniowalny
Błąd, który możesz napotkać w R to:
object of type 'closure' is not subsettable
Ten błąd występuje przy próbie podzielenia funkcji na podzbiór.
W R możliwe jest podzbiór list, wektorów, macierzy i ramek danych, ale funkcja ma typ „zamknięcie”, którego nie można podzbiorać.
W tym samouczku dokładnie wyjaśniono, jak rozwiązać ten błąd.
Jak odtworzyć błąd
Załóżmy, że tworzymy w R następującą funkcję, która pobiera każdą wartość wektora i mnoży ją przez 5:
#define function
cool_function <- function (x) {
x <- x*5
return (x)
}
Oto jak moglibyśmy wykorzystać tę funkcję w praktyce:
#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
Należy zauważyć, że każda wartość pierwotnego wektora została pomnożona przez 5.
Załóżmy teraz, że próbujemy podzielić funkcję na podzbiór:
#attempt to get first element of function
cool_function[1]
Error in cool_function[1]: object of type 'closure' is not subsettable
Otrzymujemy błąd, ponieważ nie jest możliwe podzielenie obiektu typu „closure” w R.
Możemy użyć następującej składni, aby sprawdzić, czy funkcja rzeczywiście jest typu „zamknięcie”:
#print object type of function
typeof(cool_function)
[1] “closure”
Więcej przykładów obiektów „Zamknięcie”.
Każda funkcja w R jest typu „zamknięcia”. Na przykład otrzymalibyśmy ten błąd, gdybyśmy próbowali podzielić dowolną funkcję w bazie 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
Jak rozwiązać problem
Sposobem na rozwiązanie tego błędu jest po prostu uniknięcie niedodefiniowania funkcji.
Na przykład, jeśli chcemy zastosować naszą poprzednią funkcję cool_function tylko do pierwszego elementu wektora, możemy zastosować następującą składnię:
#apply function to just first element in vector
cool_function(data[1])
[1] 10
Nie pojawia się błąd, ponieważ zamiast funkcji podstawiamy wektor.
Albo moglibyśmy zastosować funkcję cool_function do całego wektora:
#apply function to every element in vector
cool_function(data)
[1] 10 15 15 20 25 25 30 45
Nie pojawia się błąd, ponieważ w żaden sposób nie próbowaliśmy podzielić funkcji na podzbiór.
Dodatkowe zasoby
Poniższe samouczki wyjaśniają, jak rozwiązać inne typowe błędy w języku R:
Jak naprawić: warunek ma długość > 1 i zostanie użyty tylko pierwszy element
Jak naprawić w R: dim(X) musi mieć długość dodatnią
Jak naprawić w R: brakująca wartość, gdzie potrzebna jest prawda/fałsz
Jak naprawić: NA wprowadzone przez przymus