📜  如何在 R 中修复:“闭包”类型的对象不是子集

📅  最后修改于: 2022-05-13 01:55:18.910000             🧑  作者: Mango

如何在 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()函数:

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() 内置函数进行子集化:

R

# Try to access the first element
median[1]

输出:

现在我们将对 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)

输出: