Как обрабатывать в 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, введенные в результате принуждения

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *