如何在 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 中对“closure”类型的对象进行子集化。

我们可以使用以下语法来检查该函数是否确实是“闭包”类型:

 #print object type of function
typeof(cool_function)

[1] “closure”

“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

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注