Saya telah membuat skrip R utilitas, util.R, yang ingin saya gunakan dari skrip lain dalam proyek saya. Apa cara yang tepat untuk memastikan bahwa fungsi yang ditentukan skrip ini tersedia untuk berfungsi di skrip saya yang lain?
Saya mencari sesuatu yang mirip dengan require
fungsi tersebut, yang memuat paket hanya jika belum dimuat. Saya tidak ingin menelepon source("util.R")
karena itu akan memuat skrip setiap kali dipanggil.
Saya tahu bahwa saya akan mendapatkan beberapa jawaban yang memberitahu saya untuk membuat paket, seperti dalam Mengorganisir R Source Code :) Tapi saya tidak membuat sesuatu yang akan digunakan di tempat lain, ini hanya proyek yang berdiri sendiri.
Jawaban:
Inilah salah satu cara yang mungkin. Gunakan
exists
fungsi tersebut untuk memeriksa sesuatu yang unik dalamutil.R
kode Anda .Sebagai contoh:
(Diedit untuk memasukkan
mode="function"
, seperti yang ditunjukkan Gavin Simpson)sumber
exists()
- perlumode = "function"
ditambahkan untuk membuatnya sangat mudahexists()
tampaknya memunculkan kesalahan kecuali mengembalikan satu di R 3.0.2.Tidak ada hal bawaan seperti itu, karena R tidak melacak panggilan ke
source
dan tidak dapat mengetahui apa yang dimuat dari mana (ini tidak terjadi saat menggunakan paket). Namun, Anda dapat menggunakan ide yang sama seperti pada.h
file C , yaitu membungkus keseluruhan dalam:sumber
source("util.R")
di dalamif
kode, bukan?Say
util.R
menghasilkan suatu fungsifoo()
. Anda dapat memeriksa apakah fungsi ini tersedia di lingkungan global dan sumber skrip jika tidak:Itu akan menemukan apapun dengan nama itu
foo
. Jika Anda ingin mencari suatu fungsi, maka (seperti yang disebutkan oleh @Andrie)exists()
sangat membantu tetapi perlu diberi tahu jenis objek apa yang harus dicari, mis.Inilah
exists()
aksinya:sumber
grepl(..., value=TRUE)
karena istilah pencarian Anda mungkin bukan regex. +1, ngomong-ngomong.grepl()
tidak memiliki argumenvalue
, tapi saya mungkin harus memperbaiki regexp dils()
...fixed=TRUE
exists()
lebih baik tetapi saya sekarang melihat Anda telah memposting Jawaban seperti itu sementara itu.Anda dapat menulis fungsi yang menggunakan nama file dan nama lingkungan, memeriksa untuk melihat apakah file telah dimuat ke lingkungan dan menggunakan
sys.source
untuk sumber file jika tidak.Berikut adalah fungsi cepat dan belum teruji (perbaikan diterima!):
sumber
Ini adalah fungsi yang saya tulis. Ini membungkus
base::source
fungsi untuk menyimpan daftar file bersumber dalam daftar lingkungan global bernamasourced
. Ini hanya akan mengambil kembali file jika Anda memberikan.force=TRUE
argumen ke panggilan ke sumber. Tanda tangan argumennya sebaliknya identik dengan yang aslisource()
sehingga Anda tidak perlu menulis ulang skrip Anda untuk menggunakan ini.Ini cukup cerewet (banyak panggilan ke
message()
) sehingga Anda dapat menghilangkannya jika Anda peduli. Setiap saran dari pengguna R veteran sangat dihargai; Saya cukup baru mengenal R.sumber
Saya memecahkan masalah saya menggunakan seluruh alamat di mana kode saya adalah: Sebelum:
Setelah:
sumber