如何在 R 中修复:“闭包”类型的对象不是子集
在本文中,我们将讨论如何修复 R 编程语言中的“'closure' 类型的对象不是子集”错误。
在 R 中可能面临的错误是:
object of type 'closure' is not subsettable
当我们尝试对函数进行子集化时,R 编译器会产生这样的错误。在 R 中,我们可以对列表、向量等进行子集化,但函数具有不能被子集化的闭包类型。
何时可能发生此错误:
假设我们在 R 中有一个函数,它将向量的每个元素作为输入并将其与 10 相加:
R
# Define a function
Add <- function(x) {
x <- x + 10
return(x)
}
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Calling Add function
Add(vect)
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Try to access the second element
# of the function
Add[2]
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Print the type
typeof(Add)
R
# Try to access the first element
median[1]
R
# Try to access the first element
range[1]
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Try to access the second element
# of the function
Add(vect[2])
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Calling Add function
Add(vect)
让我们添加一些可以调用此函数的菜单驱动程序代码:
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Calling Add function
Add(vect)
输出:
正如你在输出中看到的,向量的每个元素都加了 10。现在,假设我们尝试对这个函数进行子集化:
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Try to access the second element
# of the function
Add[2]
输出:
编译器会产生这样的错误,因为它不允许在 R 中对具有类型闭包的对象进行子集化。为了确认该函数是闭包类型,我们可以使用具有以下语法的 typeof()函数:
Syntax: typeof(x)
Parameters:
x: It represents the specified data
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Print the type
typeof(Add)
输出:
R 中的任何函数都是闭包类型。例如,让我们先尝试对一个 median() 内置函数进行子集化:
Syntax: median(x)
Parameter: x: a vector
Return Type: Returns the median of vector elements
R
# Try to access the first element
median[1]
输出:
现在我们将对 range() 内置函数进行子集化:
Syntax: range(x)
Parameter: x: a vector
Return Type: Returns a range
R
# Try to access the first element
range[1]
输出:
如何修复此错误:
我们可以通过不对函数进行子集化来轻松修复此错误。例如,假设我们想对向量vect的第二个元素使用 Add()函数:
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Try to access the second element
# of the function
Add(vect[2])
输出:
这次程序编译成功,因为这里我们是对向量而不是函数进行子集化。另外,请注意,我们可以在整个向量上应用 Add():
R
# Define a function
Add <- function(vect) {
vect <- vect + 10
return(vect)
}
# Define a vector
vect <- c(8, 9, 12, 14, 20)
# Calling Add function
Add(vect)
输出: