Помилка в <мій код>: об'єкт типу "закриття" не підзадає


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

У разі подібної помилки Попередження: Помилка $: об’єкт типу 'закриття' не підзаданий [Немає сліду стека]

Просто додайте відповідне ім'я пакета, використовуючи :: напр

замість тегів (....)

пишіть блискучі: теги (....)


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.