Errore in <il mio codice>: l'oggetto di tipo "chiusura" non è divisibile


110

Finalmente sono stato in grado di elaborare il codice per il mio scraping . Sembrava funzionare bene e poi all'improvviso quando l'ho eseguito di nuovo, ho ricevuto il seguente messaggio di errore:

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

Non sono sicuro del perché poiché non ho cambiato nulla nel mio codice.

Si prega di avvisare.

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
}

3
Inoltre si verifica, come nel mio caso, quando digiti erroneamente []invece di ()!
Ehsan88

Risposte:


118

In generale, questo messaggio di errore significa che hai provato a utilizzare l'indicizzazione su una funzione. È possibile riprodurre questo messaggio di errore con, ad esempio

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 chiusura menzionata nel messaggio di errore è (vagamente) la funzione e l'ambiente che memorizza le variabili quando la funzione viene chiamata.


In questo caso specifico, come ha detto Joshua, stai cercando di accedere alla urlfunzione come variabile. Se definisci una variabile denominata url, l'errore scompare.

Come una questione di buona pratica, di solito dovresti evitare di nominare le variabili dopo le funzioni base-R. (La chiamata di variabili dataè una fonte comune di questo errore.)


Esistono diversi errori correlati per il tentativo di sottoinsiemi di operatori o parole chiave.

`+`[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 stai riscontrando questo problema shiny, la causa più probabile è che stai cercando di lavorare con reactiveun'espressione senza chiamarla come una funzione usando le parentesi.

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

Sebbene lavoriamo spesso con espressioni reattive in shiny come se fossero frame di dati, in realtà sono funzioni che restituiscono frame di dati (o altri oggetti).

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

Ma se proviamo a subsetarlo senza parentesi, allora stiamo effettivamente cercando di indicizzare una funzione e otteniamo un errore:

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

35

Non si definisce il vettore url, prima di provare a subsetarlo. urlè anche una funzione nel pacchetto base, quindi url[i]sta tentando di subsetare quella funzione ... il che non ha senso.

Probabilmente hai definito urlnella tua precedente sessione R, ma hai dimenticato di copiare quel codice nel tuo script.


1

In caso di questo errore simile Avviso: Errore in $: oggetto di tipo "chiusura" non è impostabile da parte [Nessuna traccia dello stack disponibile]

Basta aggiungere il nome del pacchetto corrispondente utilizzando :: es

invece dei tag (....)

scrivi shiny :: tags (....)


0

Ho riscontrato questo problema durante il tentativo di rimuovere un elemento dell'interfaccia utente all'interno di un evento reattivo:

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

Stavo ricevendo questo errore, ma non sulla riga dell'elemento removeUI, era nell'osservatore successivo per qualche motivo. Estrarre il metodo removeUI da eventReactive e posizionarlo da qualche altra parte ha rimosso questo errore per me.


-5

Penso che intendevi farlo url[i] <- paste(...

invece di url[i] = paste(.... In tal caso, sostituire =con <-.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.