Erreur dans <mon code>: l'objet de type 'fermeture' n'est pas sous-insérable

110

J'ai enfin pu élaborer le code de mon grattage . Cela semblait fonctionner correctement et tout à coup, lorsque je l'ai exécuté à nouveau, j'ai reçu le message d'erreur suivant:

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

Je ne sais pas pourquoi car je n'ai rien changé dans mon code.

S'il vous plaît donnez votre avis.

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
la source
3
Cela se produit également, comme dans mon cas, lorsque vous tapez par erreur []au lieu de ()!
Ehsan88

Réponses:

118

En général, ce message d'erreur signifie que vous avez essayé d'utiliser l'indexation sur une fonction. Vous pouvez reproduire ce message d'erreur avec, par exemple

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

La fermeture mentionnée dans le message d'erreur est (vaguement) la fonction et l'environnement qui stockent les variables lorsque la fonction est appelée.


Dans ce cas précis, comme Joshua l'a mentionné, vous essayez d'accéder à la urlfonction en tant que variable. Si vous définissez une variable nommée url, l'erreur disparaît.

Par bonne pratique, vous devez généralement éviter de nommer les variables après les fonctions base-R. (L'appel de variables dataest une source courante de cette erreur.)


Il existe plusieurs erreurs liées lors de la tentative de sous-ensemble d'opérateurs ou de mots-clés.

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

Si vous rencontrez ce problème dans shiny, la cause la plus probable est que vous essayez de travailler avec une reactiveexpression sans l'appeler en tant que fonction en utilisant des parenthèses.

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

Alors que nous travaillons souvent avec des expressions réactives en brillant comme s'il s'agissait de blocs de données, ce sont en fait des fonctions qui renvoient des blocs de données (ou d'autres objets).

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

Mais si nous essayons de le sous-ensemble sans parenthèses, alors nous essayons en fait d'indexer une fonction et nous obtenons une erreur:

isolate(
    reactive_df$col1
)
Error in reactive_df$col1 : object of type 'closure' is not subsettable
coton Richie
la source
35

Vous ne définissez pas le vecteur url,, avant d'essayer de le sous- définir . urlest également une fonction dans le package de base, donc url[i]tente de sous-ensemble cette fonction ... ce qui n'a pas de sens.

Vous avez probablement défini urldans votre précédente session R, mais vous avez oublié de copier ce code dans votre script.

Joshua Ulrich
la source
1

Dans le cas de cette erreur similaire Attention: Erreur dans $: l'objet de type 'fermeture' n'est pas sous-insérable [Aucune trace de pile disponible]

Ajoutez simplement le nom du package correspondant en utilisant :: eg

au lieu de balises (....)

écrire shiny :: tags (....)

Abhishek
la source
0

J'ai eu ce problème en essayant de supprimer un élément d'interface utilisateur dans un événement réactif:

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

J'obtenais cette erreur, mais pas sur la ligne d'élément removeUI, c'était dans l'observateur suivant après pour une raison quelconque. Retirer la méthode removeUI de eventReactive et la placer ailleurs a supprimé cette erreur pour moi.

TheMooCows237
la source
-5

Je pense que tu voulais faire url[i] <- paste(...

au lieu de url[i] = paste(.... Si c'est le cas, remplacez-le =par <-.

jmz
la source