Как обрабатывать в r: объект типа «закрытие» не является подопределяемым
Ошибка, с которой вы можете столкнуться в R:
object of type 'closure' is not subsettable
Эта ошибка возникает при попытке подмножества функции.
В R можно подмножество списков, векторов, матриц и фреймов данных, но функция имеет тип «замыкание», который не может быть подмножеством.
В этом руководстве объясняется, как именно устранить эту ошибку.
Как воспроизвести ошибку
Предположим, мы создаем в R следующую функцию, которая принимает каждое значение вектора и умножает его на 5:
#define function
cool_function <- function (x) {
x <- x*5
return (x)
}
Вот как мы могли бы использовать эту функцию на практике:
#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
Обратите внимание, что каждое значение исходного вектора было умножено на 5.
Теперь предположим, что мы пытаемся подмножество функции:
#attempt to get first element of function
cool_function[1]
Error in cool_function[1]: object of type 'closure' is not subsettable
Мы получаем ошибку, поскольку невозможно подмножество объекта типа «закрытие» в R.
Мы можем использовать следующий синтаксис, чтобы проверить, действительно ли функция имеет тип «замыкание»:
#print object type of function
typeof(cool_function)
[1] “closure”
Еще примеры объектов «Замыкание»
Каждая функция в R относится к типу «замыкания». Например, мы получили бы эту ошибку, если бы попытались подмножество любой функции в базе 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
Как устранить ошибку
Способ устранения этой ошибки — просто избегать недоопределения функции.
Например, если мы хотим применить нашу предыдущую функцию Cool_function только к первому элементу вектора, мы можем использовать следующий синтаксис:
#apply function to just first element in vector
cool_function(data[1])
[1] 10
Мы не получаем ошибки, потому что подопределяем вектор вместо функции.
Или мы могли бы применить функцию Cool_function ко всему вектору:
#apply function to every element in vector
cool_function(data)
[1] 10 15 15 20 25 25 30 45
Мы не получаем ошибку, потому что мы не пытались каким-либо образом подмножество функции.
Дополнительные ресурсы
В следующих руководствах объясняется, как устранить другие распространенные ошибки в R:
Как исправить: длина условия > 1 и будет использоваться только первый элемент
Как исправить в R: dim(X) должен иметь положительную длину
Как исправить в R: отсутствует значение, где требуется true/false
Как исправить: NA, введенные в результате принуждения