Erro em <meu código>: objeto do tipo 'encerramento' não é subsettable

110

Eu finalmente consegui descobrir o código para minha raspagem . Parecia estar funcionando bem e, de repente, quando o executei novamente, recebi a seguinte mensagem de erro:

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

Não tenho certeza do motivo, pois não mudei nada em meu código.

Por favor informar.

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
}
user1496289
fonte
3
Também ocorre, como no meu caso, quando você digita por engano em []vez de ()!
Ehsan88

Respostas:

118

Em geral, essa mensagem de erro significa que você tentou usar a indexação em uma função. Você pode reproduzir esta mensagem de erro com, por exemplo

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

O fechamento mencionado na mensagem de erro é (vagamente) a função e o ambiente que armazena as variáveis ​​quando a função é chamada.


Neste caso específico, como Joshua mencionou, você está tentando acessar a urlfunção como uma variável. Se você definir uma variável chamada url, o erro desaparece.

Por uma questão de boa prática, você geralmente deve evitar nomear variáveis ​​após funções de base R. (Chamar variáveis dataé uma fonte comum desse erro.)


Existem vários erros relacionados ao tentar subdividir operadores ou palavras-chave.

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

Se você estiver tendo esse problema em shiny, a causa mais provável é que você está tentando trabalhar com uma reactiveexpressão sem chamá-la como uma função usando parênteses.

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

Embora muitas vezes trabalhemos com expressões reativas brilhantes como se fossem quadros de dados, na verdade são funções que retornam quadros de dados (ou outros objetos).

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

Mas, se tentarmos subconjuí-la sem parênteses, estaremos, na verdade, tentando indexar uma função e obteremos um erro:

isolate(
    reactive_df$col1
)
Error in reactive_df$col1 : object of type 'closure' is not subsettable
algodão rico
fonte
35

Você não define o vetor url,, antes de tentar subconjuí-lo. urltambém é uma função no pacote básico, portanto, url[i]tentar criar um subconjunto dessa função ... o que não faz sentido.

Você provavelmente definiu urlem sua sessão R anterior, mas se esqueceu de copiar esse código para o seu script.

Joshua Ulrich
fonte
1

No caso deste erro semelhante Aviso: Erro em $: objeto do tipo 'encerramento' não é subsettable [No stack trace available]

Basta adicionar o nome do pacote correspondente usando :: eg

em vez de tags (....)

escrever :: tags brilhantes (....)

Abhishek
fonte
0

Eu tive este problema ao tentar remover um elemento de interface do usuário dentro de um evento reativo:

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

Eu estava recebendo este erro, mas não na linha do elemento removeUI, ele estava no próximo observador por algum motivo. Tirar o método removeUI de eventReactive e colocá-lo em outro lugar removeu esse erro para mim.

TheMooCows237
fonte
-5

Eu acho que você pretendia fazer url[i] <- paste(...

em vez de url[i] = paste(.... Em caso afirmativo, substitua =por <-.

jmz
fonte