Ошибка в <мой код>: объект типа "закрытие" не является подмножеством


110

Наконец-то я смог разработать код для очистки . Казалось, что он работает нормально, а затем, когда я снова запустил его, я получил следующее сообщение об ошибке:

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

Я не уверен, почему, поскольку я ничего не изменил в своем коде.

Пожалуйста, порекомендуйте.

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
И это происходит, как и в моем случае, когда вы просто ошибочно набираете []вместо ()!
Ehsan88,

Ответы:


118

Обычно это сообщение об ошибке означает, что вы пытались использовать индексацию для функции. Вы можете воспроизвести это сообщение об ошибке, например,

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

Замыкание, упомянутое в сообщении об ошибке, является (в общих чертах) функцией и средой, в которой хранятся переменные при вызове функции.


В этом конкретном случае, как упомянул Джошуа, вы пытаетесь получить доступ к urlфункции как к переменной. Если вы определите переменную с именем url, ошибка исчезнет.

Как правило, вам следует избегать именования переменных после функций base-R. (Вызов переменных data- частый источник этой ошибки.)


Есть несколько связанных ошибок при попытке подмножества операторов или ключевых слов.

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

Если вы столкнулись с этой проблемой в shiny, наиболее вероятная причина заключается в том, что вы пытаетесь работать с reactiveвыражением, не вызывая его как функцию, используя круглые скобки.

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

Хотя мы часто работаем с реактивными выражениями в сиянии, как если бы они были фреймами данных, на самом деле это функции , возвращающие фреймы данных (или другие объекты).

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

Но если мы попытаемся разбить его на подмножество без скобок, то на самом деле мы попытаемся проиндексировать функцию и получим ошибку:

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

35

Вы не определяете вектор urlперед попыткой его подмножества. urlтакже является функцией базового пакета, поэтому url[i]мы пытаемся выделить эту функцию в подмножество ... что не имеет смысла.

Вы, вероятно, определили urlв своем предыдущем сеансе R, но забыли скопировать этот код в свой скрипт.


1

В случае подобной ошибки Предупреждение: Ошибка в $: объект типа 'closure' не является подмножеством [Трассировка стека недоступна]

Просто добавьте соответствующее имя пакета, используя :: eg

вместо тегов (....)

напишите shiny :: tags (....)


0

У меня была эта проблема, когда я пытался удалить элемент пользовательского интерфейса внутри реактивного события:

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

Я получал эту ошибку, но не в строке элемента removeUI, по какой-то причине она была в следующем наблюдателе после. Удаление метода removeUI из eventReactive и его размещение в другом месте устранили эту ошибку для меня.


-5

Я думаю, ты хотел сделать url[i] <- paste(...

вместо url[i] = paste(.... Если да, замените =на <-.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.