Kesalahan dalam <kode saya>: objek tipe 'penutupan' tidak dapat diatur


110

Saya akhirnya bisa mengerjakan kode untuk scraping saya . Sepertinya berfungsi dengan baik dan kemudian tiba-tiba ketika saya menjalankannya lagi, saya mendapat pesan kesalahan berikut:

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

Saya tidak yakin mengapa karena saya tidak mengubah apa pun dalam kode saya.

Mohon saran.

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
Juga terjadi, seperti dalam kasus saya, ketika Anda salah mengetik, []bukan ()!
Ehsan88

Jawaban:


118

Secara umum, pesan kesalahan ini berarti Anda telah mencoba menggunakan pengindeksan pada suatu fungsi. Anda dapat mereproduksi pesan kesalahan ini dengan, misalnya

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

Penutupan yang disebutkan dalam pesan kesalahan adalah (secara longgar) fungsi dan lingkungan yang menyimpan variabel saat fungsi tersebut dipanggil.


Dalam kasus khusus ini, seperti yang disebutkan Joshua, Anda mencoba mengakses urlfungsi sebagai variabel. Jika Anda mendefinisikan variabel bernama url, maka kesalahannya akan hilang.

Sebagai praktik yang baik, Anda biasanya harus menghindari penamaan variabel setelah fungsi basis-R. (Memanggil variabel dataadalah sumber umum kesalahan ini.)


Ada beberapa kesalahan terkait untuk mencoba subset operator atau kata kunci.

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

Jika Anda mengalami masalah ini di shiny, kemungkinan besar penyebabnya adalah Anda mencoba bekerja dengan reactiveekspresi tanpa memanggilnya sebagai fungsi menggunakan tanda kurung.

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

Meskipun kita sering bekerja dengan ekspresi reaktif dalam bentuk mengkilap seolah-olah itu adalah bingkai data, sebenarnya itu adalah fungsi yang mengembalikan bingkai data (atau objek lain).

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

Tetapi jika kita mencoba untuk membuat subset tanpa tanda kurung, maka kita sebenarnya mencoba mengindeks suatu fungsi, dan kita mendapatkan kesalahan:

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

35

Anda tidak menentukan vektor url,, sebelum mencoba membuat subset. urljuga merupakan fungsi dalam paket dasar, jadi url[i]mencoba untuk membuat subset fungsi itu ... yang tidak masuk akal.

Anda mungkin mendefinisikan urlsesi R sebelumnya, tetapi lupa menyalin kode itu ke skrip Anda.


1

Dalam kasus kesalahan serupa ini Peringatan: Kesalahan dalam $: objek berjenis 'closure' tidak dapat diatur [Tidak tersedia jejak tumpukan]

Cukup tambahkan nama paket yang sesuai menggunakan :: mis

alih-alih tag (....)

tulis mengkilap :: tag (....)


0

Saya mengalami masalah ini saat mencoba menghapus elemen ui di dalam acara reaktif:

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

Saya mendapatkan kesalahan ini, tetapi tidak pada baris elemen removeUI, itu di pengamat berikutnya setelah untuk beberapa alasan. Mengambil metode removeUI dari eventReactive dan menempatkannya di tempat lain menghapus kesalahan ini untuk saya.


-5

Saya pikir Anda bermaksud melakukannya url[i] <- paste(...

bukannya url[i] = paste(.... Jika demikian ganti =dengan <-.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.