如何在 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