Błąd w <my code>: obiekt typu „closure” nie jest podzbiorem

110

W końcu udało mi się opracować kod do skrobania . Wydawało się, że działa dobrze, a potem nagle, gdy uruchomiłem go ponownie, pojawił się następujący komunikat o błędzie:

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

Nie jestem pewien dlaczego, ponieważ nic nie zmieniłem w moim kodzie.

Proszę doradź.

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
źródło
3
Występuje również, tak jak w moim przypadku, gdy po prostu omyłkowo piszesz []zamiast ()!
Ehsan88

Odpowiedzi:

118

Ogólnie ten komunikat o błędzie oznacza, że ​​próbowałeś użyć indeksowania funkcji. Możesz odtworzyć ten komunikat o błędzie, na przykład za pomocą

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

Zamknięcie wspomniane w komunikacie o błędzie to (luźno) funkcja i środowisko, które przechowuje zmienne, gdy funkcja jest wywoływana.


W tym konkretnym przypadku, jak wspomniał Joshua, próbujesz uzyskać dostęp do urlfunkcji jako zmiennej. Jeśli zdefiniujesz zmienną o nazwie url, błąd zniknie.

W ramach dobrej praktyki należy zazwyczaj unikać nazywania zmiennych po funkcjach typu base-R. (Wywoływanie zmiennych datajest częstym źródłem tego błędu).


Istnieje kilka powiązanych błędów przy próbie podziału operatorów lub słów kluczowych na podzbiory.

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

Jeśli napotkasz ten problem w programie shiny, najbardziej prawdopodobną przyczyną jest to, że próbujesz pracować z reactivewyrażeniem bez wywoływania go jako funkcji przy użyciu nawiasów.

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

Chociaż często pracujemy z wyrażeniami reaktywnymi tak, jakby były ramkami danych, w rzeczywistości są to funkcje, które zwracają ramki danych (lub inne obiekty).

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

Ale jeśli spróbujemy podzielić ją na podzbiory bez nawiasów, to w rzeczywistości próbujemy zindeksować funkcję i otrzymujemy błąd:

isolate(
    reactive_df$col1
)
Error in reactive_df$col1 : object of type 'closure' is not subsettable
Richie Cotton
źródło
35

Nie definiujesz wektora urlprzed próbą jego podzbioru. urljest również funkcją w pakiecie podstawowym, więc url[i]próba podzbioru tej funkcji ... co nie ma sensu.

Prawdopodobnie zdefiniowałeś urlw swojej poprzedniej sesji R, ale zapomniałeś skopiować ten kod do swojego skryptu.

Joshua Ulrich
źródło
1

W przypadku tego podobnego błędu Ostrzeżenie: Błąd w $: obiekt typu 'closure' nie jest podzestawem [Brak dostępnych śladów stosu]

Po prostu dodaj odpowiednią nazwę pakietu używając: np

zamiast tagów (....)

napisz błyszczące :: tagi (....)

Abhishek
źródło
0

Miałem ten problem podczas próby usunięcia elementu interfejsu użytkownika wewnątrz zdarzenia reaktywnego:

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

Otrzymałem ten błąd, ale nie w wierszu elementu removeUI, z jakiegoś powodu był to następny obserwator po. Usunięcie metody removeUI z eventReactive i umieszczenie jej w innym miejscu usunęło ten błąd.

TheMooCows237
źródło
-5

Myślę, że chciałeś to zrobić url[i] <- paste(...

zamiast url[i] = paste(.... Jeśli tak, wymień =się <-.

jmz
źródło