ข้อผิดพลาดใน <my code>: ออบเจ็กต์ประเภท 'closed' ไม่สามารถเซ็ตย่อยได้


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

การปิดที่กล่าวถึงในข้อความแสดงข้อผิดพลาดคือ (อย่างหลวม ๆ ) ฟังก์ชันและสภาพแวดล้อมที่เก็บตัวแปรเมื่อฟังก์ชันถูกเรียกใช้


ในกรณีเฉพาะนี้ดังที่ Joshua กล่าวถึงคุณกำลังพยายามเข้าถึง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

ในกรณีของข้อผิดพลาดที่คล้ายกันนี้ คำเตือน: ข้อผิดพลาดใน $: อ็อบเจ็กต์ประเภท 'closed' ไม่สามารถเซ็ตย่อยได้ [ไม่มีการติดตามสแต็ก]

เพียงเพิ่มชื่อแพ็กเกจที่เกี่ยวข้องโดยใช้ :: เช่น

แทนแท็ก (.... )

เขียนเงา :: แท็ก (.... )


0

ฉันมีปัญหานี้กำลังพยายามลบองค์ประกอบ ui ภายในเหตุการณ์ที่ตอบสนอง:

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

ฉันได้รับข้อผิดพลาดนี้ แต่ไม่ใช่ในบรรทัดองค์ประกอบ removeUI มันอยู่ในผู้สังเกตการณ์คนถัดไปหลังจากนั้นด้วยเหตุผลบางประการ การนำเมธอด removeUI ออกจาก eventReactive และวางไว้ที่อื่นลบข้อผิดพลาดนี้ให้ฉัน


-5

ฉันคิดว่าคุณตั้งใจจะทำ url[i] <- paste(...

url[i] = paste(...แทน ถ้าเป็นเช่นนั้นให้แทนที่=ด้วย<-.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.