Kesalahan: tidak dapat menemukan fungsi ... di R

177

Ini dimaksudkan sebagai pertanyaan FAQ, jadi harap selengkap mungkin. Jawabannya adalah jawaban komunitas, jadi silakan mengedit jika Anda merasa ada yang kurang.

Pertanyaan ini dibahas dan disetujui berdasarkan meta.

Saya menggunakan R dan mencoba some.functiontetapi saya mendapat pesan kesalahan berikut:

Error: could not find function "some.function"

Pertanyaan ini muncul dengan sangat teratur. Ketika Anda mendapatkan jenis kesalahan ini di R, bagaimana Anda bisa menyelesaikannya?

Joris Meys
sumber
5
Sebelum Anda memilih untuk menutup pertanyaan ini, bacalah diskusi ini terlebih dahulu tentang meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Jika semuanya gagal, coba ambil kode sumber untuk basis R dan paket yang Anda instal
nullglob
3
@nullglob Tampaknya agak ekstrem :-)
Gavin Simpson
Saya punya pertanyaan yang relevan: stackoverflow.com/questions/23357551/… . Dalam hal ini, Rperintah APAPUN gagal, tetapi q()! Nasihat akan sangat dihargai!
Aleksandr Blekh
Mungkin konyol, tapi hati-hati untuk tidak menyebutkan output fungsi sebagai fungsi itu sendiri. [Belajar dari pengalaman ...]
user3507584

Jawaban:

126

Ada beberapa hal yang harus Anda periksa:

  1. Apakah Anda menulis nama fungsi Anda dengan benar? Nama peka terhadap huruf besar-kecil.
  2. Apakah Anda menginstal paket yang berisi fungsi? install.packages("thePackage")(ini hanya perlu dilakukan sekali)
  3. Apakah Anda melampirkan paket itu ke ruang kerja? require(thePackage)atau library(thePackage)(ini harus dilakukan setiap kali Anda memulai sesi R baru)
  4. Apakah Anda menggunakan versi R yang lebih lama di mana fungsi ini belum ada?

Jika Anda tidak yakin dalam paket mana fungsi itu berada, Anda bisa melakukan beberapa hal.

  1. Jika Anda yakin telah menginstal dan melampirkan / memuat paket yang tepat, ketik help.search("some.function")atau ??some.functionuntuk mendapatkan kotak informasi yang dapat memberi tahu Anda paket mana yang berisi.
  2. finddan getAnywherejuga dapat digunakan untuk mencari fungsi.
  3. Jika Anda tidak memiliki petunjuk tentang paket, Anda dapat menggunakan findFndalam sospaket seperti yang dijelaskan dalam jawaban ini .
  4. RSiteSearch("some.function")atau mencari dengan rdocumentation atau rseek adalah cara alternatif untuk menemukan fungsi.

Terkadang Anda perlu menggunakan versi R yang lebih lama, tetapi jalankan kode yang dibuat untuk versi yang lebih baru. Fungsi yang baru ditambahkan (mis. HasName di R 3.4.0) tidak akan ditemukan. Jika Anda menggunakan versi R yang lebih lama dan ingin menggunakan fungsi yang lebih baru, Anda dapat menggunakan paket backports untuk membuat fungsi tersebut tersedia. Anda juga menemukan daftar fungsi yang perlu di-backport di git repo dari backports . Perlu diingat bahwa versi R yang lebih lama dari R3.0.0 tidak kompatibel dengan paket yang dibuat untuk R3.0.0 dan versi yang lebih baru.

Joris Meys
sumber
Hai Joris, saya punya pertanyaan singkat. Saya baru di R tetapi saya berhasil menginstalnya. Saya ingin menggunakan fungsi "cosvol" dalam paket "selestial" dari command-line. Tidak seperti R saya yang diinstal dari repositori Fedora ke sistem Linux saya, saya telah mengunduh paket "langit" saya di direktori berbeda di "rumah" saya. Setiap kali saya meminta fungsi "cosvol ()", katanya, "tidak dapat menemukan fungsi" cosdistCoVol "." Saya tidak yakin bagaimana memberi tahu R tentang direktur saya di mana semua fungsi diunduh dalam paket "langit" saya secara terpisah. Bantuan Anda dihargai.
Benjamin
Jika fungsinya ada di salah satu pustaka R inti / basis, Anda mungkin perlu memperbarui itu. Dalam kasus saya, saya mencoba menggunakan hasNamefungsi dalam utils. Namun, saya menggunakan 3.3.1 dan hasNametidak diperkenalkan sampai 3.4.0. Karena Anda tidak dapat memperbarui utilssebagai perpustakaan yang berdiri sendiri, R / R Studio mengatakan saya tidak memiliki perpustakaan untuk memperbarui.
mpag
@mpag Itu karena paket utils adalah bagian integral dari rilis R. Jika Anda akan menggunakan RSiteSearch ("hasName") secara harfiah entri pertama adalah referensi ke paket backports yang akan membuat fungsi itu tersedia di R 3.3.1. Lihat juga github.com/r-lib/backports untuk info lebih lanjut. Saya telah menambahkan beberapa info untuk kasus itu,
terima kasih sudah
@ JamesMeys itu sangat membantu. Saya juga ingin menyampaikan bahwa itu harus menjadi praktik standar untuk mendokumentasikan ketika suatu fungsi telah ditambahkan ke R pada halaman bantuan fungsi itu (misalnya? HasName). Misalnya tidak ada https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNameatau https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlmengatakan "diperkenalkan di R 3.4.0" Saya akhirnya mencari tahu dengan menelusuri melalui repositori github dan melihat blameutils / R / hasName.R dan base / R / match.R
mpag
@mpag atau Anda dapat membuka hit pertama secara harfiah RSiteSearch("hasName")dan mendapatkan informasi yang sama. Itu sebabnya saya menambahkan ini tahun lalu ke jawaban itu. Ini trik yang berguna untuk mengetahui ;-)
Joris Meys
29

Masalah lain, di hadapan NAMESPACE, adalah bahwa Anda mencoba menjalankan fungsi yang tidak diekspor dari paket foo .

Misalnya (dibuat-buat, saya tahu, tetapi):

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

Pertama, Anda seharusnya tidak memanggil metode S3 secara langsung, tetapi mari kita asumsikan plot.prcompsebenarnya adalah beberapa fungsi internal yang berguna di paket foo . Untuk memanggil fungsi seperti itu jika Anda tahu apa yang Anda lakukan memerlukan penggunaan :::. Anda juga perlu mengetahui namespace tempat fungsi ditemukan. Menggunakan getAnywhere()kami menemukan bahwa fungsinya dalam statistik paket :

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

Jadi sekarang kita dapat memanggilnya langsung menggunakan:

> stats:::plot.prcomp(mod)

Saya telah menggunakan plot.prcomphanya sebagai contoh untuk menggambarkan tujuannya. Dalam penggunaan normal, Anda seharusnya tidak memanggil metode S3 seperti ini. Tetapi seperti yang saya katakan, jika fungsi yang ingin Anda panggil ada (mungkin fungsi utilitas tersembunyi misalnya), tetapi dalam a namespace, R akan melaporkan bahwa ia tidak dapat menemukan fungsi kecuali jika Anda memberi tahu namespace mana yang harus dicari. .

Bandingkan ini dengan yang berikut: stats::plot.prcomp Yang di atas gagal karena saat statsdigunakan plot.prcomp, itu tidak diekspor statssebagai kesalahan memberitahu kami:

Kesalahan: 'plot.prcomp' bukan objek yang diekspor dari 'namespace: stats'

Ini didokumentasikan sebagai berikut:

pkg :: name mengembalikan nilai nama variabel yang diekspor di namespace pkg, sedangkan pkg ::: name mengembalikan nilai nama variabel internal.

Gavin Simpson
sumber
1
terima kasih - ini menyelamatkan saya setelah memutakhirkan ke R 3 untuk could not find function "anova.lm"... diperbaiki dengan menelepon stats:::anova.lm()sebagai gantinya
ErichBSchulz
Meskipun tidak relevan, penggunaan :::telah disebut sebagai kesalahan desain dan itu ::lebih disukai. Tidak dapat dengan mudah menemukan referensi.
NelsonGon
1
@NelsonGon Dengan segala hormat, ::dan :::yang berbeda dan mengedit Anda tidak bekerja ! The plot.prcomp()Fungsi tidak diekspor dari statistik namespace sehingga Anda perlu menggunakan :::.
Gavin Simpson
@GavinSimpson Benar! Saya mengambil kata-kata R dev yang dihormati untuk kesalahan desain dan tidak pernah benar-benar memverifikasinya. Mungkin itu pendapat pribadi mereka.
NelsonGon
11

Saya biasanya dapat menyelesaikan masalah ini ketika komputer berada di bawah kendali saya, tetapi lebih merupakan gangguan ketika bekerja dengan grid. Ketika kotak tidak homogen, tidak semua pustaka dapat diinstal, dan pengalaman saya sering bahwa paket tidak diinstal karena ketergantungan tidak diinstal. Untuk mengatasi ini, saya memeriksa yang berikut:

  1. Apakah Fortran diinstal? (Cari 'gfortran'.) Ini mempengaruhi beberapa paket utama dalam R.
  2. Apakah Java diinstal? Apakah jalur kelas Java benar?
  3. Periksa apakah paket itu diinstal oleh admin dan tersedia untuk digunakan oleh pengguna yang sesuai. Kadang-kadang pengguna akan menginstal paket di tempat yang salah atau berjalan tanpa akses yang sesuai ke perpustakaan yang tepat. .libPaths()adalah cek yang bagus.
  4. Periksa lddhasil untuk R, untuk memastikan tentang perpustakaan bersama
  5. Baik untuk menjalankan skrip secara berkala yang hanya memuat setiap paket yang diperlukan dan melakukan beberapa tes kecil. Ini menangkap masalah paket sedini mungkin dalam alur kerja. Ini mirip dengan membangun pengujian atau pengujian unit, kecuali itu lebih seperti tes asap untuk memastikan bahwa hal-hal yang sangat mendasar berfungsi.
  6. Jika paket dapat disimpan di lokasi yang dapat diakses jaringan, bukan? Jika tidak, apakah ada cara untuk memastikan versi yang konsisten di seluruh mesin? (Ini mungkin tampak OT, tetapi instalasi paket yang benar mencakup ketersediaan versi yang tepat .)
  7. Apakah paket tersedia untuk OS yang diberikan? Sayangnya, tidak semua paket tersedia di seluruh platform. Ini kembali ke langkah 5. Jika memungkinkan, cobalah untuk menemukan cara untuk menangani OS yang berbeda dengan beralih ke rasa paket yang sesuai atau mematikan ketergantungan dalam kasus-kasus tertentu.

Setelah mengalami ini cukup sedikit, beberapa langkah ini menjadi cukup rutin. Meskipun # 7 mungkin tampak seperti titik awal yang baik, ini terdaftar dalam urutan frekuensi yang saya gunakan.

Iterator
sumber
2
Pertimbangan yang berguna untuk memastikan, tetapi lebih merupakan jawaban untuk "Mengapa saya mendapatkan kesalahan saat menginstal paket".
IRTFM
@DWin: Mungkin, tapi tidak juga. Saya mungkin tidak jelas. Masalah-masalah ini muncul ketika pekerjaan terhenti di grid karena paket tidak diinstal. Mempertahankan konsistensi perangkat lunak pada grid tidak sulit, tetapi memang membutuhkan proses yang baik untuk instalasi, pemeliharaan, dan debugging. Ini hanya beberapa item yang muncul dari setiap fase, setidaknya karena mereka berhubungan dengan suara screaching yang datang ketika suatu fungsi tidak tersedia. :)
Iterator
6

Jika ini terjadi saat Anda memeriksa paket Anda (pemeriksaan R CMD), lihat NAMESPACE Anda.

Anda dapat menyelesaikan ini dengan menambahkan pernyataan berikut ke NAMESPACE:

exportPattern("^[^\\\\.]")

Ini mengekspor semua yang tidak dimulai dengan titik ("."). Ini memungkinkan Anda untuk memiliki fungsi tersembunyi, dimulai dengan titik:

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
sumber
Ini gagal untuk saya di RStudio - Kesalahan: '\.' adalah pelarian yang tidak dikenal dalam string karakter yang dimulai "" ^ [^ \. "
Andrew
1
Adakah saran untuk apa yang bisa saya lakukan jika saya mendapatkan kesalahan saat menggunakan paket yang tidak saya tulis? Paket itu sendiri sepertinya ingin menggunakan metode internal yang tidak didefinisikan karena mungkin penulis tidak melakukan hal di atas.
Andre Luus
4

Saya punya kesalahan

Kesalahan: tidak dapat menemukan fungsi some.function

terjadi ketika melakukan pemeriksaan R CMD dari paket yang saya buat dengan RStudio. Saya menemukan menambahkan

exportPattern (".")

ke file NAMESPACE melakukan trik. Sebagai sidenote, saya awalnya mengkonfigurasi RStudio untuk menggunakan ROxygen untuk membuat dokumentasi - dan memilih konfigurasi tempat ROxygen akan menulis file NAMESPACE saya untuk saya, yang terus menghapus suntingan saya. Jadi, dalam contoh saya, saya menghapus centang NAMESPACE dari konfigurasi Roxygen dan menambahkan exportPattern (".") Ke NAMESPACE untuk menyelesaikan kesalahan ini.

swihart
sumber
1
Anda lebih baik menggunakan roxygen2, yang mengenali suntingan yang Anda buat ke file namespace dan tetap utuh. Saya juga sangat menyarankan agar tidak menggunakan exportPattern (".") Dalam file namespace. Gunakan tag @export sebagai gantinya dalam file individual Anda, jadi Anda hanya mengekspor fungsi yang perlu diekspor. Roxygen2 akan secara otomatis memperbarui namespace untuk mengekspor semua fungsi yang perlu diekspor.
Joris Meys
1
Joris - Saya sangat menghargai Anda meluangkan waktu untuk berkomentar; Saya setuju 100% dengan apa yang Anda tulis. Saya sekarang menggunakan devtools / roxygen2 dan saya menempatkan yang berikut ini di semua fungsi yang saya perlu diekspor: # '@export
swihart
4

Kesalahan ini dapat terjadi bahkan jika nama fungsi valid jika beberapa argumen wajib hilang (yaitu Anda tidak memberikan cukup argumen).
Saya mendapatkan ini dalam konteks Rcpp, di mana saya menulis fungsi C ++ dengan argumen opsional, dan tidak memberikan argumen tersebut dalam R. Tampaknya argumen opsional dari C ++ dianggap wajib oleh R. Sebagai akibatnya, R tidak dapat menemukan fungsi yang cocok untuk nama yang benar tetapi jumlah argumen yang salah.

Fungsi Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
Panggilan R:
RcppFunction(0)memunculkan kesalahan
RcppFunction(0, 0)tidak

Matematika
sumber
2

Rdocumentation.org memiliki fungsi pencarian yang sangat berguna yang - antara lain - memungkinkan Anda menemukan fungsi - dari semua paket di CRAN, serta dari paket dari Bioconductor dan GitHub.

masukkan deskripsi gambar di sini

Mayor
sumber
1

Jika Anda menggunakan parallelMapAnda harus mengekspor fungsi khusus ke pekerjaan slave, jika tidak Anda mendapatkan kesalahan "tidak dapat menemukan fungsi".

Jika Anda menetapkan level yang tidak hilang pada parallelStartargumen yang sama harus diteruskan parallelExport, jika tidak, Anda mendapatkan kesalahan yang sama. Jadi ini harus diikuti secara ketat:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
kegagalan-bencana
sumber
0

Anda mungkin dapat memperbaiki kesalahan ini dengan spasi nama :: panggilan fungsi

comparison.cloud(colors = c("red", "green"), max.words = 100)

untuk

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
sumber
1
Kesalahan mengatakan "perbandingan" bukan "perbandingan". Saya rasa namespace bukanlah masalahnya :-)
Joris Meys
Tempat yang bagus @Joris Meys
Tony Cronin
-1

Saya mendapat kesalahan yang sama, saya menjalankan versi .99xxx, saya memeriksa pembaruan dari menu bantuan dan memperbarui RStudio saya ke 1.0x, kemudian kesalahan tidak datang

Solusi yang sangat sederhana, cukup perbarui R Studio Anda

Akshay Vijay Jain
sumber
1
Bisakah Anda jelaskan apa sifat kesalahan itu. Ini mungkin membantu, tetapi hanya dalam kasus yang sangat spesifik.
Joris Meys