<my code =“”>出错:'closure'类型的对象不是子集</my>

时间:2012-07-03 09:48:58

标签: r r-faq

我终于能够计算出my scraping的代码了。它似乎工作正常,然后突然再次运行它时,我收到以下错误消息:

Error in url[i] = paste("http://en.wikipedia.org/wiki/", gsub(" ", "_",  : 
  object of type 'closure' is not subsettable

我不知道为什么我在代码中没有改变任何内容。

请告知。

library(XML)
library(plyr)

names <- c("George Clooney", "Kevin Costner", "George Bush", "Amar Shanghavi")

for(i in 1:length(names)) {
    url[i] = paste('http://en.wikipedia.org/wiki/', gsub(" ","_", names[i]) , sep="")

    # some parsing code
}

6 个答案:

答案 0 :(得分:102)

通常,此错误消息表示您已尝试对函数使用索引。您可以使用例如

重现此错误消息
mean[1]
## Error in mean[1] : object of type 'closure' is not subsettable
mean[[1]]
## Error in mean[[1]] : object of type 'closure' is not subsettable
mean$a
## Error in mean$a : object of type 'closure' is not subsettable

错误消息中提到的闭包是(松散地)调用函数时存储变量的函数和环境。


在这种特殊情况下,正如Joshua所提到的,您正在尝试将url函数作为变量进行访问。如果定义名为url的变量,则错误消失。

作为一种良好实践,通常应避免在base-R函数之后命名变量。 (调用变量data是此错误的常见原因。)


尝试子集运算符或关键字时有几个相关的错误。

`+`[1]
## Error in `+`[1] : object of type 'builtin' is not subsettable
`if`[1]
## Error in `if`[1] : object of type 'special' is not subsettable

如果您在shiny中遇到此问题,最可能的原因是您尝试使用reactive表达式而不使用括号将其作为函数调用。

library(shiny)
reactive_df <- reactive({
    data.frame(col1 = c(1,2,3),
               col2 = c(4,5,6))
})

虽然我们经常使用闪亮的反应式表达式,就好像它们是数据帧一样,但它们实际上是函数,它们返回数据帧(或其他对象)。

isolate({
    print(reactive_df())
    print(reactive_df()$col1)
})
  col1 col2
1    1    4
2    2    5
3    3    6
[1] 1 2 3

但是如果我们尝试在没有括号的情况下对其进行子集化,那么我们实际上是在尝试索引函数,并且我们得到一个错误:

isolate(
    reactive_df$col1
)
Error in reactive_df$col1 : object of type 'closure' is not subsettable

答案 1 :(得分:33)

在尝试对其进行子集之前,您没有定义向量urlurl也是基础包中的一个函数,因此url[i]正在尝试对该函数进行子集化......这没有用。

您可能在之前的R会话中定义了url,但忘记将该代码复制到您的脚本中。

答案 2 :(得分:0)

我遇到了这个问题,试图在反应事件中删除一个ui元素:

myReactives <- eventReactive(input$execute, {
    ... # Some other long running function here
    removeUI(selector = "#placeholder2")
})

我遇到此错误,但是在removeUI元素行上却没有,因为某种原因,它出现在下一个观察者中。从eventReactive中删除removeUI方法并将其放置在其他位置对我来说消除了此错误。

答案 3 :(得分:0)

如果发生类似错误 警告:$中的错误:“ closure”类型的对象不可子集化   [没有可用的堆栈跟踪]

只需使用::添加相应的包名称 例如

代替标签(....)

写 闪亮的::标签(....)

答案 4 :(得分:0)

这可能意味着一个未定义的变量。

答案 5 :(得分:-4)

我认为你打算做url[i] <- paste(...

而不是url[i] = paste(...。如果是,请将=替换为<-