Error en <mi código>: el objeto de tipo 'cierre' no es subconjunto

110

Finalmente pude resolver el código para mi raspado . Parecía estar funcionando bien y, de repente, cuando lo ejecuté de nuevo, recibí el siguiente mensaje de error:

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

No estoy seguro de por qué, ya que no cambié nada en mi código.

Por favor avise.

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
}
usuario1496289
fuente
3
También ocurre, como en mi caso, cuando simplemente escribes por error en []lugar de ()!
Ehsan88

Respuestas:

118

En general, este mensaje de error significa que ha intentado utilizar la indexación en una función. Puede reproducir este mensaje de error con, por ejemplo

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

El cierre mencionado en el mensaje de error es (vagamente) la función y el entorno que almacena las variables cuando se llama a la función.


En este caso específico, como mencionó Joshua, está intentando acceder a la urlfunción como una variable. Si define una variable nombrada url, el error desaparece.

Como una buena práctica, generalmente debe evitar nombrar variables después de funciones base-R. (Las variables de llamada dataes una fuente común de este error).


Hay varios errores relacionados al intentar crear un subconjunto de operadores o palabras clave.

`+`[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 se encuentra con este problema en shiny, la causa más probable es que está tratando de trabajar con unreactive expresión sin llamarla como una función usando paréntesis.

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

Si bien a menudo trabajamos con expresiones reactivas en brillante como si fueran marcos de datos, en realidad son funciones que devuelven marcos de datos (u otros objetos).

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

Pero si tratamos de crear un subconjunto sin paréntesis, en realidad estamos tratando de indexar una función y obtenemos un error:

isolate(
    reactive_df$col1
)
Error in reactive_df$col1 : object of type 'closure' is not subsettable
algodón Richie
fuente
35

No define el vector url, antes de intentar crear un subconjunto. urltambién es una función en el paquete base, por lo queurl[i] está intentando subconjuntar esa función ... lo cual no tiene sentido.

Probablemente lo definió urlen su sesión de R anterior, pero olvidó copiar ese código en su script.

Joshua Ulrich
fuente
1

En caso de este error similar Advertencia: Error en $: el objeto de tipo 'cierre' no es subconjunto [No hay seguimiento de pila disponible]

Simplemente agregue el nombre del paquete correspondiente usando :: eg

en lugar de etiquetas (....)

escribir etiquetas brillantes :: (....)

Abhishek
fuente
0

Tuve este problema al intentar eliminar un elemento de la interfaz de usuario dentro de un evento reactivo:

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

Recibí este error, pero no en la línea del elemento removeUI, estaba en el siguiente observador después por alguna razón. Sacar el método removeUI del eventReactive y colocarlo en otro lugar eliminó este error para mí.

TheMooCows237
fuente
-5

Creo que pretendías hacer url[i] <- paste(...

en lugar de url[i] = paste(.... Si es así, reemplácelo =con <-.

jmz
fuente