Одна ошибка, с которой вы можете столкнуться в 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, введенные принуждением